RT,我实现了一个 query 函数
query(i,j) 表示对于给定的序列 val,求出 lcm(lcm(valk)(1≤k≤n,k=i,j),vali+valj)。
现在 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);