洛谷 CF550C Divisibility by Eight(DP/数论)
遇事不决,小学数学。
https://www.luogu.com.cn/problem/CF550C
题目大意:
给你一个位数不超过 100 的非负整数 N(不含前导 0)。
你的任务是判断这个数字能否通过去掉其中的一些位上的数(当然不能去掉全部),使其成为一个能被 8 整除的正整数(不含前导 0)。
特别注意:你不能重新排列数字的顺序。
输入 #1
3454
输出 #1
YES
344
输入 #2
10
输出 #2
YES
0
输入 #3
111111
输出 #3
NO
一个性质:看后三位数,后三位数可以整除8即使8的倍数
两位的一位的数字,打表暴力都可
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=200200,M=2002;
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
string s;
cin>>s;
bool flag=false;
for(LL i=0;i<s.size();i++)
{
if(s[i]=='0'||s[i]=='8')
{
flag=true;
cout<<"YES"<<endl;
cout<<s[i]-'0'<<endl;
break;
}
}
if(flag==false)
{
for(LL i=0;i<s.size();i++)
{
for(LL j=i+1;j<s.size();j++)
{
LL ans=(s[i]-'0')*10+(s[j]-'0');
if(ans%8==0)
{
flag=true;
cout<<"YES"<<endl;
cout<<ans<<endl;
break;
}
for(LL k=j+1;k<s.size();k++)
{
LL sum=(s[i]-'0')*100+(s[j]-'0')*10+(s[k]-'0');
if(sum%8==0)
{
flag=true;
cout<<"YES"<<endl;
cout<<sum<<endl;
break;
}
}
if(flag==true) break;
}
if(flag==true) break;
}
}
if(flag==false) cout<<"NO"<<endl;
}
return 0;
}
在cf评定为1500的题目,在洛谷上是个普及-的水平,我是fw(: