蒟蒻求助
查看原帖
蒟蒻求助
625380
FriedrichC楼主2022/11/9 10:41

rt,为什么如果不特判if(g%(mod+1)==0){puts("0");return 0;}就只有95pts呢?

如果 gg 本身整除模数,那么算快速幂的结果应该也是 00 呀。

求大佬解答。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=999911658;
int n,g,fac[40010],sum[5],ans;
int d[]={0,2,3,4679,35617};
vector<int>v;
int qpow(int a,int b,int p)
{
    int res=1;
    while(b)
    {
        if(b&1)(res*=a)%=p;
        (a*=a)%=p;
        b>>=1;
    }
    return res;
}
void init(int n)//处理阶乘
{
    fac[0]=1;
    for(int i=1;i<=n;++i)
        fac[i]=fac[i-1]*i%mod;
}
int C(int n,int m,int p)
{
    if(n<m)return 0;
    if(n==m||!m)return 1;
    return fac[n]*qpow(fac[m],p-2,p)%p*qpow(fac[n-m],p-2,p)%p;
    //逆元使用快速幂计算
}
int lucas(int n,int m,int p)
{
    if(n<m)return 0;
    if(!n||!m)return 1;
    return C(n%p,m%p,p)*lucas(n/p,m/p,p)%p;
}
void CRT()
{
    for(int i=1;i<=4;++i)
        (ans+=sum[i]*(mod/d[i])%mod*qpow(mod/d[i],d[i]-2,d[i]))%=mod;
}
void solve()//计算n的约数,注意,并非分解质因数
{
    int x=n;
    for(int i=1;i*i<=x;++i)
    {
        if(x%i==0)
        {
            v.push_back(i);
            if(i*i!=n)v.push_back(n/i);
        }
    }
}
signed main()
{
    cin>>n>>g;
    if(g%(mod+1)==0){puts("0");return 0;}
    solve();
    for(int i=1;i<=4;++i)
    {
        init(d[i]);
        for(auto x:v)
            (sum[i]+=lucas(n,x,d[i]))%=d[i];
    }
    CRT();
    cout<<qpow(g,ans,mod+1)<<endl;//真正的模数是mod+1
	return 0;
}
2022/11/9 10:41
加载中...