Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define LL long long int
- #define MOD 1000000007
- #define MAX(a,b) ((a>b)?a:b)
- using namespace std;
- int visited[1000010],M,p[1000010],r[1000010],primes[80005],ind[1000010],tamp,Mat[1001][1001];
- bool sieve[1000010];
- LL mod(LL a,int nr)
- {
- a%=nr;
- if(a<0)
- a+=nr;
- return a;
- }
- void fill_sieve()
- {
- memset(sieve,true,sizeof(sieve));
- for(int i=2;i*i<1000001;++i)
- {
- if(!sieve[i])
- continue;
- for(int j=i;j*i<=1000000;++j)
- sieve[i*j]=false;
- }
- tamp=0;
- sieve[0]=sieve[1]=false;
- for(int i=0;i<=1000000;++i)
- if(sieve[i])
- primes[tamp++]=i,ind[i]=tamp-1;
- }
- int pot[80005];
- int K;
- void f(int num)
- {
- if(sieve[num])
- {
- pot[ind[num]]=MAX(pot[ind[num]],1);
- return;
- }
- int cont=0,idx=0;
- while(primes[idx]*primes[idx]<=num)
- {
- if(num%primes[idx]==0)
- {
- num/=primes[idx];
- visited[num]=K+1;
- ++cont;
- pot[idx]=MAX(pot[idx],cont);
- }
- else
- cont=0,++idx;
- }
- if(num>1)
- {
- if(primes[idx]==num)
- pot[ind[num]]=MAX(pot[ind[num]],cont+1);
- else
- pot[ind[num]]=MAX(pot[ind[num]], 1);
- }
- }
- LL fpow(LL a,LL b)
- {
- LL ans=1LL;
- while(b)
- {
- if(b&1)
- ans=(ans*a)%MOD;
- a=(a*a)%MOD;
- b>>=1;
- }
- return ans;
- }
- int done[1000010];
- int main()
- {
- fill_sieve();
- int n=0,C,N,T=0;
- K=0;
- ifstream fin("loopover.in");
- fin>>C>>N;
- LL sol;
- if(C==1)
- {
- for(int i=1;i<=N;++i)
- for(int j=1;j<=N;++j)
- fin>>Mat[i][j];
- int s=N*(N+1)/2;
- sol=0;
- for(int i=1;i<=N;++i)
- s-=Mat[1][i];
- if(s==0)
- for(int i=1;i<=N;++i)
- sol+=min(Mat[i][1]-((i-1)*N+1),N-(Mat[i][1]-((i-1)*N+1)));
- else
- for(int i=1;i<=N;++i)
- sol+=min((Mat[1][i]-i)/N,N-(Mat[1][i]-i)/N);
- }
- else
- {
- fin>>M;
- for(int i=1;i<=N;++i)
- for(int j=1;j<=N;++j)
- Mat[i][j]=(i-1)*N+j;
- for(int m=1;m<=M;++m)
- {
- char ch;
- int nr;
- fin>>ch>>nr;
- if(ch=='L')
- {
- int aux=Mat[nr][1];
- for(int j=1;j<N;++j)
- Mat[nr][j]=Mat[nr][j+1];
- Mat[nr][N]=aux;
- }
- else if(ch=='R')
- {
- int aux=Mat[nr][N];
- for(int j=N; j>1; --j)
- Mat[nr][j]=Mat[nr][j-1];
- Mat[nr][1]=aux;
- }
- else
- if(ch=='U')
- {
- int aux=Mat[1][nr];
- for(int i=1;i<N;++i)
- Mat[i][nr]=Mat[i+1][nr];
- Mat[N][nr]=aux;
- }
- else
- {
- int aux=Mat[N][nr];
- for(int i=N;i>1;--i)
- Mat[i][nr]=Mat[i-1][nr];
- Mat[1][nr]=aux;
- }
- }
- for(int i=1;i<=N;++i)
- for(int j=1;j<=N;++j)
- n=(i-1)*N+j,p[n]=Mat[i][j],++n;
- --n;
- int tam=0;
- for(int i=1;i<=n;++i)
- if(visited[i]!=K+1)
- {
- r[tam]=0;
- int P=i;
- while(visited[P]!=K+1)
- visited[P]=K+1,++r[tam],P=p[P];
- if(done[r[tam]]!=T+1)
- done[r[tam]]=T+1,++tam;
- }
- ++K;
- memset(pot,0,sizeof(pot));
- for(int i=0;i<tam;++i)
- {
- if(visited[r[i]]==K+1)
- continue;
- visited[r[i]]=K+1;
- f(r[i]);
- }
- K+=2;
- sol=1LL;
- LL X;
- for(int i=0;i<tamp;++i)
- X=fpow(primes[i],pot[i]),sol=mod(sol*X,MOD);
- }
- ofstream fout("loopover.out");
- fout<<sol<<'\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement