a53

biprime_BIG

a53
Oct 4th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.44 KB | None | 0 0
  1. /// Ex. N= 9999999999999999999197600000000000000000184023 M =9999999999999999999197400000000000000000192048
  2. /// SOL ar fi P= 99999999999999999999976 Q= 99999999999999999991998 unde N=P*Q
  3. #include<bits/stdc++.h>
  4. #define LG_MAX 100 + 5
  5. using namespace std;
  6. typedef int BigNumber[LG_MAX];
  7.  
  8. BigNumber nr1, nr2, p, pp, D, unu, sol1;
  9. unsigned long long m, n, p1, D1, X1, sol;
  10.  
  11. void citire(BigNumber x);
  12. void afisare(BigNumber x);
  13. void diferenta(BigNumber a, BigNumber b, BigNumber d);
  14. void add(BigNumber A, BigNumber B);
  15. void mul(BigNumber A, BigNumber B);
  16. void mulmic(BigNumber A, int B);
  17. void numar(BigNumber A, unsigned long long &nr);
  18. void AtribValue(BigNumber H, unsigned long X);
  19. void divmaremic(BigNumber a, long long nr);
  20. int main()
  21. {
  22. citire(nr1);
  23. if(nr1[0]<=20)
  24. {
  25. numar(nr1,n);
  26. cin>>m;
  27. p1=n-m+1;
  28. D1=p1*p1-4*n;
  29. X1=(p1 - 1LL*sqrt(D1))/2;
  30. cout<<X1<<" "<<n/X1;
  31. return 0;
  32. }
  33. citire(nr2);
  34. diferenta(nr1, nr2, p);
  35. unu[0]=1;
  36. unu[1]=1;
  37. add(p,unu);/// p = n-m+1
  38. memcpy(pp, p, sizeof(p)); /// copie p
  39. mul(pp, p); /// pp=p*p;
  40. mulmic(nr1, 4); /// n=4*n
  41. diferenta(pp, nr1, D); /// p*p-4*n
  42. numar(D, D1); /// transform delta in numar
  43. D1=1LL*sqrt(D1); /// scot radical
  44. AtribValue(D, D1);
  45. diferenta(p, D, sol1);
  46. divmaremic(sol1, 2); /// prima solutie (p - sqrt(D))/2
  47. afisare(sol1);
  48. add(p, D); /// a II - a solutie (p + sqrt(D))/2
  49. divmaremic(p, 2);
  50. afisare(p);
  51. return 0;
  52. }
  53. void citire(BigNumber x)
  54. {
  55. int i;
  56. char s[LG_MAX];
  57. cin>>s;
  58. x[0] = strlen(s);
  59. for(i = x[0]-1; i >= 0; i--) x[x[0]-i] = s[i]-'0';
  60. for(i = x[0]+1; i < LG_MAX; i++) x[i] = 0;
  61. }
  62. void afisare(BigNumber x)
  63. {
  64. for(int i = x[0]; i >= 1; i--)
  65. cout<<x[i];
  66. cout<<' ';
  67. }
  68. void diferenta(BigNumber a,BigNumber b,BigNumber d)
  69. {
  70. int i,t = 0;
  71. if(a[0] < b[0])
  72. {
  73. diferenta(b,a,d);
  74. }
  75. else
  76. {
  77. for(i = 1; i <= a[0]; i++)
  78. {
  79. d[i] = a[i]-b[i]+t;
  80. if(d[i] < 0) d[i]+= 10,t = -1;
  81. else t = 0;
  82. }
  83. i--;
  84. while(i >= 1 && !d[i]) i--;
  85. d[0] = i;
  86. }
  87. }
  88. void add(BigNumber A, BigNumber B)
  89. {
  90. int i, t = 0;
  91. for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
  92. A[i] = (t += A[i] + B[i]) % 10;
  93. A[0] = i - 1;
  94. }
  95. void mul(BigNumber A, BigNumber B)
  96. {
  97. int i, j, t;
  98. BigNumber C;
  99. memset(C, 0, sizeof(C));
  100. for (i = 1; i <= A[0]; i++)
  101. {
  102. for (t=0, j=1; j <= B[0] || t; j++, t/=10)
  103. C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;
  104. if (i + j - 2 > C[0]) C[0] = i + j - 2;
  105. }
  106. memcpy(A, C, sizeof(C));
  107. }
  108. void mulmic(BigNumber A, int B)
  109. {
  110. int i, t = 0;
  111. for (i = 1; i <= A[0] || t; i++, t /= 10)
  112. A[i] = (t += A[i] * B) % 10;
  113. A[0] = i - 1;
  114. }
  115. void numar(BigNumber A, unsigned long long &nr)
  116. {
  117. nr=0;
  118. for(int i = A[0]; i > 0 ; i--)
  119. nr=nr*10+A[i];
  120. }
  121. void AtribValue(BigNumber H, unsigned long X)
  122. {
  123. H[0] = 0;
  124. while (X) {
  125. ++H[0];
  126. H[H[0]] = X % 10;
  127. X /= 10;
  128. }
  129. }
  130. void divmaremic(BigNumber a, long long nr)
  131. {
  132. int i, t = 0;
  133. for (i = a[0]; i > 0; i--, t %= nr)
  134. a[i] = (t = t * 10 + a[i]) / nr;
  135. for (; a[0] > 1 && !a[a[0]]; a[0]--);
  136. }
Add Comment
Please, Sign In to add comment