唉,考场上只想出了的处理各个位上的数字相加的方法,至于那个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;
} 
京公网安备 11010502036488号