洛谷 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(:

posted @ 2022-10-04 14:56  Vijurria  阅读(41)  评论(0编辑  收藏  举报