题目:
样例1:
|
YES 344 |
样例2:
|
YES 0 |
样例3:
|
NO |
思路:
这道题就三个条件
关键条件是 能够被 8 整除。 而能被 8 整除的有一个重要的性质是
能被8整除的数的特征是它的末三位是0、8、16、24、32、40、48、56、64、72、80、88、96中的一个 这个特征是由能被2整除和能被4整除的数的特征推导出来的。掌握了这个特征,我们就可以很方便地判断一个数能否被8 整除了。 |
即看整个数中的 末三位是否可以被 8 整除,然后这是个不计删除个数,所以我们只要找到这些数是否在 num 里面即可。
代码详解如下:
#include <iostream>
#include <unordered_map>
#define endl '\n'
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10,MOD = 998244353;
string num;
// 寻找满足末3位能够被 8 整除的数,是否在 num 里面
inline bool FindAns(string &ans)
{
int n = ans.size(),idx = 0;
// 循环寻找
for(auto i : num)
{
if(i == ans[idx]) ++idx;
if(idx == n) return true;
}
return false;
}
inline void solve()
{
string ans;
getline(cin,num);
// 由于不计删除个数,所以我们找到 末三位 可以被8整除 的数字计科
// 获取在 末三位 以内的数字可以被 8 整除的数
// i += 8 就可以满足被 8 整除
for(int i = 0;to_string(i).size() <= 3;i += 8)
{
// 获取该性质的数字
ans = to_string(i);
// 开始判断是否是答案
if(FindAns(ans))
{
cout << "YES" << endl << ans << endl;
return ;
}
}
cout << "NO" << endl;
}
int main()
{
// freopen("a.txt", "r", stdin);
___G;
int _t = 1;
// cin >> _t;
while (_t--)
{
solve();
}
return 0;
}