Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// Ex. N= 9999999999999999999197600000000000000000184023 M =9999999999999999999197400000000000000000192048
- /// SOL ar fi P= 99999999999999999999976 Q= 99999999999999999991998 unde N=P*Q
- #include<bits/stdc++.h>
- #define LG_MAX 100 + 5
- using namespace std;
- typedef int BigNumber[LG_MAX];
- BigNumber nr1, nr2, p, pp, D, unu, sol1;
- unsigned long long m, n, p1, D1, X1, sol;
- void citire(BigNumber x);
- void afisare(BigNumber x);
- void diferenta(BigNumber a, BigNumber b, BigNumber d);
- void add(BigNumber A, BigNumber B);
- void mul(BigNumber A, BigNumber B);
- void mulmic(BigNumber A, int B);
- void numar(BigNumber A, unsigned long long &nr);
- void AtribValue(BigNumber H, unsigned long X);
- void divmaremic(BigNumber a, long long nr);
- int main()
- {
- citire(nr1);
- if(nr1[0]<=20)
- {
- numar(nr1,n);
- cin>>m;
- p1=n-m+1;
- D1=p1*p1-4*n;
- X1=(p1 - 1LL*sqrt(D1))/2;
- cout<<X1<<" "<<n/X1;
- return 0;
- }
- citire(nr2);
- diferenta(nr1, nr2, p);
- unu[0]=1;
- unu[1]=1;
- add(p,unu);/// p = n-m+1
- memcpy(pp, p, sizeof(p)); /// copie p
- mul(pp, p); /// pp=p*p;
- mulmic(nr1, 4); /// n=4*n
- diferenta(pp, nr1, D); /// p*p-4*n
- numar(D, D1); /// transform delta in numar
- D1=1LL*sqrt(D1); /// scot radical
- AtribValue(D, D1);
- diferenta(p, D, sol1);
- divmaremic(sol1, 2); /// prima solutie (p - sqrt(D))/2
- afisare(sol1);
- add(p, D); /// a II - a solutie (p + sqrt(D))/2
- divmaremic(p, 2);
- afisare(p);
- return 0;
- }
- void citire(BigNumber x)
- {
- int i;
- char s[LG_MAX];
- cin>>s;
- x[0] = strlen(s);
- for(i = x[0]-1; i >= 0; i--) x[x[0]-i] = s[i]-'0';
- for(i = x[0]+1; i < LG_MAX; i++) x[i] = 0;
- }
- void afisare(BigNumber x)
- {
- for(int i = x[0]; i >= 1; i--)
- cout<<x[i];
- cout<<' ';
- }
- void diferenta(BigNumber a,BigNumber b,BigNumber d)
- {
- int i,t = 0;
- if(a[0] < b[0])
- {
- diferenta(b,a,d);
- }
- else
- {
- for(i = 1; i <= a[0]; i++)
- {
- d[i] = a[i]-b[i]+t;
- if(d[i] < 0) d[i]+= 10,t = -1;
- else t = 0;
- }
- i--;
- while(i >= 1 && !d[i]) i--;
- d[0] = i;
- }
- }
- void add(BigNumber A, BigNumber B)
- {
- int i, t = 0;
- for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
- A[i] = (t += A[i] + B[i]) % 10;
- A[0] = i - 1;
- }
- void mul(BigNumber A, BigNumber B)
- {
- int i, j, t;
- BigNumber C;
- memset(C, 0, sizeof(C));
- for (i = 1; i <= A[0]; i++)
- {
- for (t=0, j=1; j <= B[0] || t; j++, t/=10)
- C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;
- if (i + j - 2 > C[0]) C[0] = i + j - 2;
- }
- memcpy(A, C, sizeof(C));
- }
- void mulmic(BigNumber A, int B)
- {
- int i, t = 0;
- for (i = 1; i <= A[0] || t; i++, t /= 10)
- A[i] = (t += A[i] * B) % 10;
- A[0] = i - 1;
- }
- void numar(BigNumber A, unsigned long long &nr)
- {
- nr=0;
- for(int i = A[0]; i > 0 ; i--)
- nr=nr*10+A[i];
- }
- void AtribValue(BigNumber H, unsigned long X)
- {
- H[0] = 0;
- while (X) {
- ++H[0];
- H[H[0]] = X % 10;
- X /= 10;
- }
- }
- void divmaremic(BigNumber a, long long nr)
- {
- int i, t = 0;
- for (i = a[0]; i > 0; i--, t %= nr)
- a[i] = (t = t * 10 + a[i]) / nr;
- for (; a[0] > 1 && !a[a[0]]; a[0]--);
- }
Add Comment
Please, Sign In to add comment