hdu5392

来源:互联网 发布:黑魂3dlc武器数据 编辑:程序博客网 时间:2024/06/16 15:14

求循环节加上线性求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 3221225473const 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;}


0 0
原创粉丝点击