2019牛客暑期多校训练营(第三场)D Big Integer【数学】【欧拉定理】

题目链接:https://ac.nowcoder.com/acm/contest/883/D
题解:
2019牛客暑期多校训练营(第三场)D Big Integer【数学】【欧拉定理】_第1张图片2019牛客暑期多校训练营(第三场)D Big Integer【数学】【欧拉定理】_第2张图片
AC代码:

#include
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll prime[maxn],k[maxn];
int tot;
ll p,m,n;
ll mul(ll x,ll y,ll mo)
{
    ll ans=0;
    while(y){
        if(y&1)
            ans=(ans+x)%mo;
        x=(x+x)%mo;
        y>>=1;
    }
    return ans;
}
ll qpow(ll x,ll y,ll mo)
{
    ll ans=1;
    while(y)
    {
        if(y&1)
            ans=mul(ans,x,mo)%mo;
        x=mul(x,x,mo)%mo;
        y>>=1;
    }
    return ans;
}
void fenjie(ll n)
{
    tot=0;
    for(ll i=2;i*i<=n;i++){
        if(n%i==0){
            prime[++tot]=i;
            k[tot]=0;
            while(n%i==0){
                k[tot]++;
                n/=i;
            }
        }
    }
    if(n>1){
        prime[++tot]=n;
        k[tot]=1;
    }
}
int main()
{
    int t;
    cin>>t;
    while(t--){
        cin>>p>>n>>m;
        ll tmp;
        if(p==2||p==5)
        {
            cout<<0<<endl;
            continue;
        }
        ll tmpphi=6*(p-1);//9*p的欧拉值
        ll x=1e18;
        for(ll i=1;i*i<=tmpphi;i++){
            if(tmpphi%i==0){
                ll tmp=tmpphi/i;
                if(qpow(10,i,9LL*p)==1){
                    x=min(x,i);
                }
                if(qpow(10,tmp,9LL*p)==1){
                    x=min(x,tmp);
                }
            }
        }
        fenjie(x);
        ll ans=0;
        ll g;
        for(ll i=1;i<=min(30LL,m);i++){
            g=1;
            for(int j=1;j<=tot;j++){
                g=g*qpow(prime[j],ceil(1.0*k[j]/i),2e9);
            }
            ans=ans+n/g;
        }
        if(m>30){
            ans=ans+(m-30)*(n/g);
        }
        cout<<ans<<endl;
    }
    return 0;
}
/*
2
11 8 1
7 6 2
*/

我一定可以的!!!

你可能感兴趣的:(程序竞赛编程)