rt,为什么如果不特判if(g%(mod+1)==0){puts("0");return 0;}就只有95pts呢?
如果 g 本身整除模数,那么算快速幂的结果应该也是 0 呀。
求大佬解答。
#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;
}