Advertisement
a53

Perioada1

a53
Oct 18th, 2021
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.34 KB | None | 0 0
  1. // prof. Pit - Rada Ionel Vasile
  2. // O(sqrt(n)+sqrt(fi(n))*log(fi(n)))
  3.  
  4. #include<fstream>
  5. #define baza 100000
  6. using namespace std;
  7. ifstream fin("perioada1.in");
  8. ofstream fout("perioada1.out");
  9.  
  10. long long N;
  11. void prod(long long a[], long long b[]){
  12. long long t,c[5]={0,0,0,0,0};
  13. int i,j;
  14. for(i=0;i<=2;i++){
  15. for(j=0;j<=2;j++){
  16. c[i+j]=c[i+j]+a[i]*b[j];
  17. }
  18. }
  19. t=0;
  20. for(i=0;i<=4;i++){
  21. t=t+c[i];
  22. c[i]=t%baza;
  23. t=t/baza;
  24. }
  25. for(i=0;i<=4;i++){
  26. a[i]=c[i];
  27. }
  28. }
  29.  
  30. void modulo(long long a[], long long MOD){
  31. long long r;
  32. r=a[4];
  33. int i;
  34. for(i=3;i>=0;i--){
  35. r=(r*baza+a[i])%MOD;
  36. }
  37. for(i=0;i<=4;i++){
  38. a[i]=r%baza;
  39. r=r/baza;
  40. }
  41. }
  42.  
  43. long long p10(long long b, long long MOD){
  44. long long r,p[5]={1,0,0,0,0},a[5]={10,0,0,0,0};
  45. int i;
  46. while(b){
  47. if(b%2==1){
  48. ///p=(p*a)%MOD;
  49. prod(p,a);
  50. modulo(p,MOD);
  51. }
  52. b=b/2;
  53. ///a=(a*a)%MOD;
  54. prod(a,a);
  55. modulo(a,MOD);
  56. }
  57. r=0;
  58. for(i=2;i>=0;i--){
  59. r=r*baza+p[i];
  60. }
  61. return r;
  62. }
  63.  
  64. int main(){
  65. long long fi,x,d,p,perioada;
  66. long long c;
  67. fin>>N;
  68. fi=N;
  69. x=N;
  70.  
  71. c=0;
  72. while(x%2==0){
  73. x=x/2;
  74. c++;
  75. }
  76. if(c){
  77. fi=fi/2;
  78. }
  79. d=3;
  80. while(d*d<=x){
  81. c=0;
  82. while(x%d==0){
  83. x=x/d;
  84. c++;
  85. }
  86. if(c){
  87. fi=fi/d*(d-1);
  88. }
  89. d=d+2;
  90. }
  91. if(x>1){
  92. fi=fi/x*(x-1);
  93. }
  94. perioada=0;
  95. for(d=1;d*d<fi;d++){
  96. if(fi%d==0){
  97. // fout<<d<<"\n";
  98. p=p10(d,N);
  99. if(p==1){
  100. perioada=d;
  101. break;
  102. }
  103. }
  104. }
  105. if(perioada==0 && d*d==fi){
  106. // fout<<d<<"\n";
  107. p=p10(d,N);
  108. if(p==1){
  109. perioada=d;
  110. }
  111. }
  112. if(perioada==0){
  113. for(d=d-1;d>=1;d--){
  114. if(fi%d==0){
  115. // fout<<fi/d<<"\n";
  116. p=p10(fi/d,N);
  117. if(p==1){
  118. perioada=fi/d;
  119. break;
  120. }
  121. }
  122. }
  123. }
  124. fout<<perioada<<"\n";
  125. fout.close();
  126. fin.close();
  127. return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement