CS 400 8 Divisible 同余+模擬


題意:給出一個數 十進制長度為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;

}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com