求助
查看原帖
求助
643735
RNTBW楼主2023/5/28 14:36

RT,我实现了一个 query 函数

query(i,j) 表示对于给定的序列 valval,求出 lcm(lcm(valk)(1≤k≤n,k≠i,j),vali+valj)lcm(lcm(val_k)(1\le k\le n,k\ne i,j),val_i+val_j)。

现在 query 函数随机了几组数据没有问题,但是第二个样例的第四组数据不对,可能是统计答案的时候出现了问题

有哪位神犇可以看一下吗,孩子调了一上午了/dk

query:

int query(int k,int s,int ans)
{
	int t=ans,l=k+s;
	add.clear();
	memset(vis1,0,sizeof(vis1));
	memset(vis2,0,sizeof(vis2));
    //vis1:对于这个质因数,val中最大的幂次有没有被删掉,vis2表示次大的幂
	while(k>1)
	{
		int now=p[k],d=0;
		while(k%now==0) k/=now,d++;
		if(d==mx[now])vis1[now]=1;
		else if(d==sc[now])vis2[now]=1;
		add.push_back(now);
        //mx:最大幂 sc:次大幂 td:三大幂 add:被修改的质因数集合
	}
	while(s>1)
	{
		int now=p[s],d=0;
		while(s%now==0) s/=now,d++;
		if(!vis1[now]&&!vis2[now])add.push_back(now);
		if(mx[now]==sc[now]&&vis1[now]&&d==sc[now])vis2[now]=1;
		else if(mx[now]>sc[now]&&d==sc[now])vis2[now]=1;
		if(d==mx[now])vis1[now]=1;
	}
	for(auto now:add)
	{
		if(vis1[now]&&vis2[now])
		{
			t=t*qm_n(qm_n(now,mx[now]-td[now]),mod-2)%mod;
			nowmx[now]=td[now];//nowmx:当前这个质因数最大的幂
		}
		else if(vis1[now])
		{
			t=t*qm_n(qm_n(now,mx[now]-sc[now]),mod-2)%mod;
			nowmx[now]=sc[now];
		}
	}
	while(l>1)
	{
		int now=p[l],d=0;
		while(l%now==0) l/=now,d++;
		if(d>nowmx[now])t=t*qm_n(now,d-nowmx[now])%mod;
	}
	for(auto now:add) nowmx[now]=mx[now];
	return t;
}

main:

scanf("%d",&n);
x=ans=0;
int now=1;
for(i=1;i<=n;i++) scanf("%d",&a[i]);
for(i=1;i<=n;i++)
{
	if(arr[i])continue;
	arr[i]=1;
	k=a[i];s=1;
	while(k!=i)
	{
		arr[k]=1;
		k=a[k];s++;
	}
	if(!cnt[s])val[++x]=s;
	cnt[s]++;//val:环长 cnt[i]:环长为i的环的个数
	while(s>1)
	{
		k=p[s];d=0;
		while(s%k==0) d++,s/=k;
		update(k,d);//更新幂次
	}
}
for(i=1;i<=prn;i++) now=now*qm_n(pr[i],mx[pr[i]])%mod;//pr:质数集合
for(i=1;i<=x;i++)//可能是这里有问题
	for(j=1;j<=x;j++)
	{
		k=val[i],s=val[j];
		if(k==s)ans=(ans+cnt[k]*k%mod* (cnt[k]-1) %mod*k%mod*query(k,k,now)%mod)%mod;
		else ans=(ans+cnt[k]*k%mod*cnt[s]%mod*s%mod*query(k,s,now)%mod)%mod;
	}
printf("%d\n",ans);
2023/5/28 14:36
加载中...