Cod sursa(job #1691724)

Utilizator Men_In_BlackMarco Polo Men_In_Black Data 19 aprilie 2016 11:58:42
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>
#define nmax 20001

using namespace std;

ifstream fin("perm2.in");
ofstream fout("perm2.out");

int vact[nmax],vprv[nmax],vst[nmax];
int n,i,k=1,r,p,z,h,h2=1;
bool b=1,vpoz[nmax]={false};

int cmmdc(int a, int b)
{
    if((!a) || (!b)) return a+b;
    if(a>b) return cmmdc(a%b,b);
    return cmmdc(a,b%a);
}

int main()
{
    fin>>n;
    h=n;
    for(i=1;i<=n;i++){fin>>vst[i];vprv[i]=vst[i];if(vst[i]==i){vpoz[i]=true;if(z==0)vact[++z]=1;}}


    while(b)
    {k++;b=0;
    for(i=h2;i<=h;i++)
    {if(!vpoz[i])
    {vprv[i]=vst[vprv[i]];
    if(vprv[i]==i){vpoz[i]=true;
    if(vact[z]!=k)vact[++z]=k;
    }}}
    for(i=1;i<=n;i++)if(!vpoz[i]){b=1;break;}
    for(i=h2;i<=n,vpoz[i];i++)h2++;
    for(i=h;i>=1,vpoz[i];i--)h--;
    }

    if(z==1)fout<<vact[1];
    else{
    p=(vact[1]*vact[2])/cmmdc(vact[1],vact[2]);
    for(i=3;i<=z;i++)
    p=(p*vact[i])/cmmdc(p,vact[i]);

    fout<<p;}
    return 0;
}