hdu 5392 Infoplane in Tina Town (置换循环长度)

来源:互联网 发布:按键精灵免费网络验证 编辑:程序博客网 时间:2024/05/01 14:30

给一个置换,求循环长度,结果对3221225473取模。


有一个莫名其妙的定理:点击打开链接

根据该定理求最小公倍数就好了,用欧几里得算法求的话会TLE.

将每个循环长度分解质因子再求就好了。

坑点:模数用int是存不下的。

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;#define maxn 3000005typedef __int64 LI;const unsigned int mod=3221225473;int a[maxn],num[maxn];bool vis[maxn];inline LI pow1(LI a,LI b){    LI ans=1;    while(b)    {        if(b&1) ans=ans*a%mod;        a=a*a%mod;        b>>=1;    }    return ans;}int main(){    int t,i,j,n;    cin>>t;    while(t--)    {        scanf("%d",&n);        for(i=1;i<=n;++i)        {            vis[i]=0;            num[i]=0;            scanf("%d",&a[i]);        }        for(i=1;i<=n;++i)        {            if(vis[i]) continue;            int l=0;            j=i;            while(!vis[j]){                vis[j]=1;                ++l;                j=a[j];            }            for(j=2;j<=l;++j)            {                int cnt=0;                while(l%j==0)                {                    ++cnt;                    l/=j;                }                if(cnt>num[j]) num[j]=cnt;            }            if(l>1) num[l]=max(1,num[l]);        }        LI ans=1;        for(i=2;i<=n;++i) ans=ans*pow1(i,num[i])%mod;        printf("%I64d\n",ans);    }    return 0;}


0 0
原创粉丝点击