Advertisement
AlexGo11

Untitled

Jan 4th, 2020
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.05 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. long long const p = 1e9 + 7;
  5.  
  6. long long gcd(long long a, long long b) {
  7.     if (a == 0)
  8.         return b;
  9.     return gcd(b % a, a);
  10. }
  11.  
  12.  
  13. long long mul(long long a, long long b, long long p) {
  14.     long long temp = (long double)a * (long double)b / p;
  15.     long long r = a * b - temp * p;
  16.     while (r < 0) r += p;
  17.     if (r >= p)
  18.         r -= p;
  19.     return r;
  20. }
  21.  
  22.  
  23. long long func(long long x, long long n) {
  24.     return (mul(x, x, n) + 1) % n;
  25. }
  26.  
  27. long long find_divisor(long long n) {
  28.     long long x = 1, y = 1;
  29.     long long divisor = 1;
  30.     long long i = 0, stage = 2;
  31.     while (divisor == 1 || divisor == n) {
  32.         y = func(y, n);
  33.         x = func(func(x, n), n);
  34.         if (i == stage) {
  35.             x = 2 + rand() % (n - 1);
  36.             y = 2 + rand() % (n - 1);
  37.             stage <<= 1;
  38.         }
  39.         divisor = gcd(llabs(x - y), n);
  40.         ++i;
  41.     }
  42.     return divisor;
  43. }
  44.  
  45. int main() {
  46.     ios_base::sync_with_stdio(0);
  47.     cin.tie(0);
  48.     cout.tie(0);
  49.     long long n;
  50.     cin >> n;
  51.     long long x = find_divisor(n);
  52.     long long y = n / x;
  53.     if (x >= y)
  54.         swap(x, y);
  55.     cout << x << " " << y;
  56.     return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement