标签:hdu5392
求循环节加上线性求lcm 即lcm等于公共的质因子乘每个数本身的质因子。
代码:
#include <algorithm> #include <iostream> #include <sstream> #include <cstdlib> #include <cstring> #include <iomanip> #include <cstdio> #include <string> #include <bitset> #include <vector> #include <queue> #include <stack> #include <cmath> #include <list> #include <map> #include <set> #define sss(a,b,c) scanf("%d%d%d",&a,&b,&c) #define mem1(a) memset(a,-1,sizeof(a)) #define mem(a) memset(a,0,sizeof(a)) #define ss(a,b) scanf("%d%d",&a,&b) #define s(a) scanf("%d",&a) #define p(a) printf("%d\n", a) #define INF 0x3f3f3f3f #define w(a) while(a) #define PI acos(-1.0) #define LL long long #define eps 10E-9 #define N 3000010 #define mod 3221225473 const int SIGMA_SIZE=26; const int MAXN=100010; const int MAXNODE=600010; using namespace std; void mys(int& res) { int flag=0; char ch; while(!(((ch=getchar())>='0'&&ch<='9')||ch=='-')) if(ch==EOF) res=INF; if(ch=='-') flag=1; else if(ch>='0'&&ch<='9') res=ch-'0'; while((ch=getchar())>='0'&&ch<='9') res=res*10+ch-'0'; res=flag?-res:res; } void myp(int a) { if(a>9) myp(a/10); putchar(a%10+'0'); } /*************************THE END OF TEMPLATE************************/ int arr[N]; int lcm[N]; bool vis[N]; int main() { int n,t; s(t); w(t--) { s(n); mem(vis); bool flag = false; for(int i=1; i<=n; i++) { s(arr[i]); if(i>1 && arr[i]-arr[i-1] != 1) flag = true; } mem(lcm); if(flag) { for(int i=1; i<=n; i++) { if(!vis[i]) { int a=i; int cnt=0; w(!vis[a]){ cnt++; vis[a]=1; a=arr[a]; } for(int j=2; j*j<=cnt; j++){ int ans=0; w(cnt%j==0){ ans++; cnt/=j; } lcm[j]=max(lcm[j],ans); } if(cnt>1) lcm[cnt] = max(lcm[cnt], 1); } } unsigned LL sum=1; for(int i=2; i<=n; i++){ for(int j=1; j<=lcm[i]; j++) sum =(unsigned LL)(sum)*i%mod; } printf("%u\n",sum); } else p(0); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:hdu5392
原文地址:http://blog.csdn.net/bigsungod/article/details/47781137