就是求最大公倍数,但要用分解质因子求。
自己写的WA到爆。。。。
#include<iostream> #include<stdio.h> #include<math.h> #include<algorithm> using namespace std; #define rd(x) scanf("%d",&x) #define rd2(x,y) scanf("%d%d",&x,&y) #define ll long long int #define maxn 3000005 #define maxm 500010 int t,n; int f[maxn],v[maxn],num[maxn]; int maxx(int a,int b){ return a>b?a:b; } int main() { rd(t); long long mod=3221225473; while(t--){ rd(n); for(int i=1;i<=n;i++) { rd(f[i]); v[i]=0; num[i]=0; } for(int i=1;i<=n;i++) { if(!v[i]){ int l=0; int k=i; while(!v[k]){ l++; v[k]=1; k=f[k]; }//求循环节长度 for(int j=2;j*j<=l;j++)//质因子分解 { int nn=0; while(l%j==0) {nn++;l/=j;} num[j]=maxx(num[j],nn); } if(l>1) num[l]=maxx(1,num[l]); } } ll res=1; for(int i=2;i<=n;i++) { while(num[i]--) res=(res*i)%mod; } printf("%I64d\n",res); } return 0; }
时间: 2024-10-11 18:14:26