【NOIP模拟】Candy

题面

分析

被吓到了,说实话,以为考的是我觉得不可能的高精度。。

然而我真的数学好差,这种一眼结论都没看出来!!!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,也就是10%(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;
}
“Make my parents proud,and impress the girl I like.”
原文地址:https://www.cnblogs.com/NSD-email0820/p/9748206.html