数据过水且题解有误
查看原帖
数据过水且题解有误
195331
Mine_KingCattleya楼主2022/10/12 15:32
  1. 第一发代码计算欧拉函数的函数如下:
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;
}

容易发现当 xx 没有大于根号的质因子时返回值为 00,但是过了第三个点以外的所有点。
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+2anmodphi{a_{i+1}}^{{a_{i+2}}^{{\cdots}^{a_n}}} \bmod phi 的结果,显然后面的分讨屁用没有,这样的代码显然是错的,但还是过了,说明数据很水。

请求撤下所有题解并加强数据。


还有就是这篇这篇题解的代码:

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,但是这两份码核心代码写得一模一样,大概率第二篇的码是抄袭第一篇的。

2022/10/12 15:32
加载中...