题面
分析
被吓到了,说实话,以为考的是我觉得不可能的高精度。。
然而我真的数学好差,这种一眼结论都没看出来!!!70分可以随便拿啊!!
70pts
可以发现,最后的数字都每一位一定都是一样的。可以写成 ∑digit *111……111(1的个数为该数长度)
比如233 -->888=(2+3+3)*111=8*111
而最后求的是最小质因数,不妨就用前面这一部分来求质因数,比较佛系,但是能得70
100pts
后面这一部分其实也很好处理,就在快速幂的过程中求解
考虑1111111...1=(10n-1)/9 (n表示有多少个1)
那么问题就转化成了(10n-1)/9 %y==0,也就是10n %(9*y)==1
我们可以枚举这个y.因为和最大也就5e6,所以y最多也不会超过5e6,用线性筛预处理一下即可
代码
#include<bits/stdc++.h> using namespace std; #define N 5000500 #define ll long long ll a,len,cnt,ans,sum; char c[N]; ll v[N],prime[N]; ll ksm(ll a,ll b,ll mod) { ll ret=1; while(b) { if(b&1)ret=ret*a%mod; a=a*a%mod; b>>=1; } return ret; } void primes(ll n) { for(ll i=2;i<=n;i++) { if(!v[i]) { prime[++cnt]=i; v[i]=i; } for(ll j=1;j<=cnt;j++) { if(prime[j]>v[i]||prime[j]*i>n)break; v[prime[j]*i]=prime[j]; } } } int main() { scanf("%s",c); len=strlen(c); for(ll i=0;i<len;i++) sum+=c[i]-'0'; primes(5000100); for(ll i=1;i<=cnt;i++) if(sum%prime[i]==0||ksm(10,len,9*prime[i])==1) { ans=prime[i];break; } printf("%lld ",ans); return 0; }