唉,考场上只想出了的处理各个位上的数字相加的方法,至于那个11111...111就只有打表得到了一个小数据范围的,但貌似没什么用。所以,在此就只讲正解了。

由题意得,我们需要先把各个位上的数字加起来,求出这个sum的最小质因数,然后对于可看作,即.这个用快速幂解决,快速幂时带个取余操作。完了。

#include<bits/stdc++.h>
using namespace std;

const int maxn = 5e6;

string s;
int prime[maxn+5];
int tot,n,sum,ans;
int mark[maxn+5];

void init()
{
    freopen("candy.in","r",stdin);
    freopen("candy.out","w",stdout);
}

void get()
{
    /*for(int i=2;i<=maxn;i++)
    {
        if(!mark[i])
        {
            prime[++tot]=i;
        }
        for(int j=1;j<=tot;j++)
        {
            if(i*prime[j]>n) break;
            mark[i*prime[j]]=1;
            if(i%prime[j]==0)
            {
                break;
            }
        }
    }*/
    for(int i=2;i<=maxn;i++){
        if(!mark[i])
            mark[i] = i, prime[++tot] = i;
        for(int j=1;j<=tot;j++)
        {
            if(prime[j] > mark[i] || prime[j] > maxn / i) break;
            mark[i * prime[j]] = prime[j];
        }
    }
}

int qpow(int a,int k,int P)
{
    a %= P; int ret = 1;
    while(k){
        if(k & 1) ret = 1LL * ret * a % P;
        a = 1LL * a * a % P;
        k >>= 1;
    }
    return ret;
}

int main()
{
    //init();
    cin>>s;
    n=s.size();
    for(int i=0;i<n;i++)
    {
        sum+=s[i]-'0';
    }
    get();
    for(int i=1;i<=tot;i++)
    {
        if(sum%prime[i]==0||qpow(10,n,9*prime[i])==1)
        {
            printf("%d",prime[i]);
            break;
        }
    }
    return 0;
}