int phi(int x)
{
int res=x;
for(int i=2;i*i<=x;i++)
if(x%i==0)
{
res=res/i*(i-1);
while(x%i==0) x/=i;
}
if(x) res=res/x*(x-1);
return res;
}
容易发现当 x 没有大于根号的质因子时返回值为 0,但是过了第三个点以外的所有点。
2. 所有题解的计算答案的函数基本都是这个样子:
int js(int i,int p)
{
if(i==n)return a[n]%=p;
int phi=_phi(p),nex=js(i+1,phi);
if(gcd(a[i],p)==1)return a[i]=ksm(a[i],nex,p);
else
{
if(a[i+1]<phi)return a[i]=ksm(a[i],a[i+1],p);
return a[i]=ksm(a[i],nex+phi,p);
}
}
容易发现递归完之后 a[i+1] 是 ai+1ai+2⋯anmodphi 的结果,显然后面的分讨屁用没有,这样的代码显然是错的,但还是过了,说明数据很水。
请求撤下所有题解并加强数据。
int js(int i,int p)
{
if(i==n)return a[n]%=p;
int phi=_phi(p),nex=js(i+1,phi);
if(gcd(a[i],p)==1)return a[i]=ksm(a[i],nex,p);
else
{
if(a[i+1]<phi)return a[i]=ksm(a[i],a[i+1],p);
return a[i]=ksm(a[i],nex+phi,p);
}
}
ll f(ll i,ll p){
if(i==n)return a[n]%=p;
ll ou=phi(p),nex=f(i+1,ou);
if(gcd(a[i],p)==1)return a[i]=qpow(a[i],nex,p);
else{
if(a[i+1]<ou)return a[i]=qpow(a[i],a[i+1],p);
return a[i]=qpow(a[i],nex+ou,p);
}
}
这个核心代码里显然 nex=a[i+1],所以对 a[i] 的修改是没用的,a[i+1] 可以全部替换为 nex,但是这两份码核心代码写得一模一样,大概率第二篇的码是抄袭第一篇的。