Advertisement
a53

LoopOver

a53
Jun 1st, 2022 (edited)
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define LL long long int
  3. #define MOD 1000000007
  4. #define MAX(a,b) ((a>b)?a:b)
  5. using namespace std;
  6. int visited[1000010],M,p[1000010],r[1000010],primes[80005],ind[1000010],tamp,Mat[1001][1001];
  7. bool sieve[1000010];
  8.  
  9. LL mod(LL a,int nr)
  10. {
  11. a%=nr;
  12. if(a<0)
  13. a+=nr;
  14. return a;
  15. }
  16.  
  17. void fill_sieve()
  18. {
  19. memset(sieve,true,sizeof(sieve));
  20. for(int i=2;i*i<1000001;++i)
  21. {
  22. if(!sieve[i])
  23. continue;
  24. for(int j=i;j*i<=1000000;++j)
  25. sieve[i*j]=false;
  26. }
  27. tamp=0;
  28. sieve[0]=sieve[1]=false;
  29. for(int i=0;i<=1000000;++i)
  30. if(sieve[i])
  31. primes[tamp++]=i,ind[i]=tamp-1;
  32. }
  33.  
  34. int pot[80005];
  35. int K;
  36. void f(int num)
  37. {
  38. if(sieve[num])
  39. {
  40. pot[ind[num]]=MAX(pot[ind[num]],1);
  41. return;
  42. }
  43. int cont=0,idx=0;
  44. while(primes[idx]*primes[idx]<=num)
  45. {
  46. if(num%primes[idx]==0)
  47. {
  48. num/=primes[idx];
  49. visited[num]=K+1;
  50. ++cont;
  51. pot[idx]=MAX(pot[idx],cont);
  52. }
  53. else
  54. cont=0,++idx;
  55. }
  56. if(num>1)
  57. {
  58. if(primes[idx]==num)
  59. pot[ind[num]]=MAX(pot[ind[num]],cont+1);
  60. else
  61. pot[ind[num]]=MAX(pot[ind[num]], 1);
  62. }
  63. }
  64.  
  65. LL fpow(LL a,LL b)
  66. {
  67. LL ans=1LL;
  68. while(b)
  69. {
  70. if(b&1)
  71. ans=(ans*a)%MOD;
  72. a=(a*a)%MOD;
  73. b>>=1;
  74. }
  75. return ans;
  76. }
  77.  
  78. int done[1000010];
  79. int main()
  80. {
  81. fill_sieve();
  82. int n=0,C,N,T=0;
  83. K=0;
  84. ifstream fin("loopover.in");
  85. fin>>C>>N;
  86. LL sol;
  87. if(C==1)
  88. {
  89. for(int i=1;i<=N;++i)
  90. for(int j=1;j<=N;++j)
  91. fin>>Mat[i][j];
  92. int s=N*(N+1)/2;
  93. sol=0;
  94. for(int i=1;i<=N;++i)
  95. s-=Mat[1][i];
  96. if(s==0)
  97. for(int i=1;i<=N;++i)
  98. sol+=min(Mat[i][1]-((i-1)*N+1),N-(Mat[i][1]-((i-1)*N+1)));
  99. else
  100. for(int i=1;i<=N;++i)
  101. sol+=min((Mat[1][i]-i)/N,N-(Mat[1][i]-i)/N);
  102. }
  103. else
  104. {
  105. fin>>M;
  106. for(int i=1;i<=N;++i)
  107. for(int j=1;j<=N;++j)
  108. Mat[i][j]=(i-1)*N+j;
  109. for(int m=1;m<=M;++m)
  110. {
  111. char ch;
  112. int nr;
  113. fin>>ch>>nr;
  114. if(ch=='L')
  115. {
  116. int aux=Mat[nr][1];
  117. for(int j=1;j<N;++j)
  118. Mat[nr][j]=Mat[nr][j+1];
  119. Mat[nr][N]=aux;
  120. }
  121. else if(ch=='R')
  122. {
  123. int aux=Mat[nr][N];
  124. for(int j=N; j>1; --j)
  125. Mat[nr][j]=Mat[nr][j-1];
  126. Mat[nr][1]=aux;
  127. }
  128. else
  129. if(ch=='U')
  130. {
  131. int aux=Mat[1][nr];
  132. for(int i=1;i<N;++i)
  133. Mat[i][nr]=Mat[i+1][nr];
  134. Mat[N][nr]=aux;
  135. }
  136. else
  137. {
  138. int aux=Mat[N][nr];
  139. for(int i=N;i>1;--i)
  140. Mat[i][nr]=Mat[i-1][nr];
  141. Mat[1][nr]=aux;
  142. }
  143. }
  144. for(int i=1;i<=N;++i)
  145. for(int j=1;j<=N;++j)
  146. n=(i-1)*N+j,p[n]=Mat[i][j],++n;
  147. --n;
  148. int tam=0;
  149. for(int i=1;i<=n;++i)
  150. if(visited[i]!=K+1)
  151. {
  152. r[tam]=0;
  153. int P=i;
  154. while(visited[P]!=K+1)
  155. visited[P]=K+1,++r[tam],P=p[P];
  156. if(done[r[tam]]!=T+1)
  157. done[r[tam]]=T+1,++tam;
  158. }
  159. ++K;
  160. memset(pot,0,sizeof(pot));
  161. for(int i=0;i<tam;++i)
  162. {
  163. if(visited[r[i]]==K+1)
  164. continue;
  165. visited[r[i]]=K+1;
  166. f(r[i]);
  167. }
  168. K+=2;
  169. sol=1LL;
  170. LL X;
  171. for(int i=0;i<tamp;++i)
  172. X=fpow(primes[i],pot[i]),sol=mod(sol*X,MOD);
  173. }
  174. ofstream fout("loopover.out");
  175. fout<<sol<<'\n';
  176. return 0;
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement