Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define LMAX 10005
- typedef int Huge[LMAX];
- void Set(Huge &A){
- memset(A,0,sizeof(A));
- }
- void Atrib(Huge &A,int x){
- Set(A);
- if(!x) A[++A[0]]=0;
- while(x){
- A[++A[0]]=x%10;
- x/=10;
- }
- }
- void Write(Huge A){
- for(int i=A[0];i;--i)
- printf("%d",A[i]);
- printf("\n");
- }
- void ProdMic(Huge &A,int x){
- if(x==0){
- Atrib(A,0);
- return ;
- }
- int i,r=0;
- for(i=1;i<=A[0]||r;++i){
- int aux=r+A[i]*x;
- A[i]=aux%10;
- r=aux/10;
- }
- A[0]=i-1;
- }
- #define NMAX 1000000
- int G[NMAX+5];
- bool Viz[NMAX+5];
- char fact[NMAX+5];
- void Descomp(int x){
- int d=2;
- while(d*d<=x){
- char p=0;
- while(x%d==0){
- ++p;
- x/=d;
- }
- fact[d]=max(fact[d],p);
- ++d;
- }
- if(x>1) fact[x]=max(fact[x],(char)1);
- }
- int DFS(int Start){
- /// Calculeaza lungimea unui circuit
- Viz[Start]=1;
- int len=1,poz=G[Start];
- while(poz!=Start){
- Viz[poz]=1;
- ++len;
- poz=G[poz];
- }
- return len;
- }
- Huge CMMMC;
- int main(){
- freopen("permutarepow.in","r",stdin);
- freopen("permutarepow.out","w",stdout);
- int n;
- scanf("%d",&n);
- for(int i=1;i<=n;++i)
- scanf("%d",&G[i]);
- for(int i=1;i<=n;++i)
- if(Viz[i]==0)
- Descomp(DFS(i));
- Atrib(CMMMC,1);
- for(int i=1;i<=n;++i){
- int P=1;
- for(char j=1;j<=fact[i];++j)
- P*=i;
- if(P!=1) ProdMic(CMMMC,P);
- }
- Write(CMMMC);
- return 0;
- }
Add Comment
Please, Sign In to add comment