CS 400 8 Divisible 同余+模拟

来源:互联网 发布:半自动咖啡机推荐 知乎 编辑:程序博客网 时间:2024/06/07 08:21
题意:给出一个数 十进制长度为n,问该数是否能通过重新排列digit使得其被8整除.(不能有前导0)
n<=1000.若有解 找到最小的一个解,并且输出重新排列后的数,否则输出-1.


由10^j≡0(mod 2^j) (定义归纳证明)  p*10^3≡0(mod 2^3) 
x=10^n *a[n]+...10*a[1]+a[0]  若100*a[2]+10*a[1]+a[0]能被8整除,则x能被8整除.


枚举最后三位数,若无前导0并且和合法 则用字符串保存该可行解 最后输出最小的即可.O(n^2).

#include <bits/stdc++.h>using namespace std;typedef unsigned long long ll;const int N=2e5+5,M=15,inf=0x3f3f3f3f;int n,a[N],b[N];bool check(int i,int j,int k){    if(n==3&&i==0)        return false;    int x=i*100+j*10+k;    if(x%8)        return false;    int cnt[15]={0};    cnt[i]++,cnt[j]++,cnt[k]++;    for(int i=0;i<10;i++)        if(cnt[i]>b[i])            return false;    bool res=true;    if(b[0]-cnt[0]>0)        res=false;    for(int i=1;i<10;i++)        if(b[i]!=cnt[i])            res=true;    return res;}vector<string> res;void print(int i,int j,int k){    int cnt[15];    for(int i=0;i<10;i++)        cnt[i]=b[i];    cnt[i]--,cnt[j]--,cnt[k]--;    int p=1;    while(cnt[p]==0&&p<10)        p++;    cnt[p]--;    string t="";    if(p<10)        t+=p+'0';    for(int i=0;i<10;i++)        for(int j=0;j<cnt[i];j++)            t+=i+'0';    t+=i+'0',t+=j+'0',t+=k+'0';    res.push_back(t);}char s[N];int main(){    memset(b,0,sizeof(b));    cin>>s;    n=strlen(s);    for(int i=1;i<=n;i++)        a[i]=s[i-1]-'0',b[a[i]]++;    if(n==1)    {        if(a[1]%8)            puts("-1");        else            cout<<a[1]<<endl;        return 0;    }    if(n==2)    {        int x=a[1]*10+a[2],y=-1;        if(a[2]!=0)        y=10*a[2]+a[1];        if(x%8&&y%8)            puts("-1");        else        {            if(x%8==0&&y%8==0)                cout<<min(x,y)<<endl;            else if(x%8)                cout<<y<<endl;            else                cout<<x<<endl;        }        return 0;    }    bool flag=false;    for(int i=0;i<10;i++)        for(int j=0;j<10;j++)            for(int k=0;k<10;k++)            {                if(check(i,j,k))                {                    print(i,j,k);                    flag=true;                }            }    if(!flag)        puts("-1");    else    {        sort(res.begin(),res.end());        cout<<res[0]<<endl;    }    return 0;}


原创粉丝点击