Cod sursa(job #654018)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 29 decembrie 2011 13:30:35
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <fstream>
#define lu 105
#define FOR for(i=1;i<=n;i++) for(j=1;j<=n;j++)
using namespace std;
int i,j,ai[lu][lu],a[lu][lu],x,y,m,e,n,te,pr,aj[lu][lu],em,prim[lu*lu],ti,tj,Q;
int ve[lu*lu],s,d,ww,we,fr[lu*lu],q2,r2,es,tti,ttj;
char c;
void swaping(int w1,int w2,int w3,int w4)
{
        int l,col;
        l=(a[w1][w2]-1)/n+1,col=a[w1][w2]%n;
        if (col==0) col=n;
        ai[l][col]=w3,aj[l][col]=w4;


        l=(a[w3][w4]-1)/n+1,col=a[w3][w4]%n;
        if (col==0) col=n;
        ai[l][col]=w1,aj[l][col]=w2;
        swap( a[w1][w2],a[w3][w4]);
}
int main()
{
        freopen("perspic.in","r",stdin);
        freopen("perspic.out","w",stdout);

        scanf("%d %d \n",&n,&m);

        FOR e++,a[i][j]=e,ai[i][j]=i,aj[i][j]=j;

        for(i=1; i<=m; i++) {
                scanf("%c %d %d",&c,&x,&y);
                if (c=='R')
                        for(j=1; j<=n; j++)
                                swaping (x,j,y,j);
                if (c=='C')
                        for(j=1; j<=n; j++)
                                swaping(j,x,j,y);
                if (c=='E') {
                        scanf("%d %d \n",&q2,&r2);
                        swaping(x,y,q2,r2);

                }
                if (c!='E') scanf("\n");
        }
        FOR {
                es=1;
                ti=i,tj=j;
                while (1) {
                        tti=ti;
                        ttj=tj;
                        ti=ai[tti][ttj];
                        tj=aj[tti][ttj];
                        if (ti==i&&tj==j) break;
                        es++;
                }
                if ((ai[i][j]!=i||j!=aj[i][j])&&ai[ti][tj]==i&&aj[ti][tj]==j) es++;
                Q++,ve[Q]=es,em=max(em,es);
        }
        prim[1]=1;

        for(i=2; i<=em; i++) if (prim[i]==0)
                        for(j=i+i; j<=em; j+=i) prim[j]=1;

        for(i=1; i<=em; i++)
                if (prim[i]==0) te++,prim[te]=i;


        for(i=1,ww=ve[1]; i<=n*n; d=0,ww=ve[i],i++)
                while (d<te&&ww!=1) {
                        d++,s=0;
                        while (ww%prim[d]==0) ww=ww/prim[d],s++;
                        if (fr[prim[d]]<s) fr[prim[d]]=s;
                }
        for(i=1,pr=1,we=1; i<=10000; i++,we=1)
                if (fr[i]>0) {
                        for(j=1; j<=fr[i]; j++) we=(we*i)%13007;
                        pr=(pr*we)%13007;
                }

        printf("%d\n",pr);
        return 0;
}