Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <time.h>
- #include <cmath>
- #include <cstdlib>
- #include <algorithm>
- #include <vector>
- #include <map>
- #include <iostream>
- using namespace std;
- vector<long long> base;
- vector<long long> ans;
- long long gcd(long long a, long long b) {
- if (b == 0)
- return a;
- return gcd(b, a%b);
- }
- long long isprime(long long n) {
- if (n == 1)
- return false;
- for (int i = 2; i*i <= n; i++) {
- if (n%i == 0)
- return false;
- }
- return true;
- }
- void init_base(long long n) {
- long long M = long long(sqrt(exp(sqrt(log(n)*log(log(n))))));
- for (long long i = 2; i < M + 1; i++)
- if (isprime(i))
- base.push_back(i);
- }
- void faktor(long long n) {
- srand(static_cast <unsigned int> (time(NULL)));
- long long a, b, x;
- int size = base.size();
- while (true) {
- map<int, vector<long long>> last_a;
- map<int, vector<long long>> last_e;
- while (last_a.size() < size+1) {
- b = rand() % (n- long long (sqrt(n)) - 1) + sqrt(n);
- a = (b*b) % n;
- if (a == 0)
- continue;
- vector<long long> vec_a;
- vector<long long> vec_e;
- x = a;
- for (int i = 0; i < base.size(); i++) {
- int k = 0;
- while (x % base[i] == 0) {
- k++;
- x = long long(x / base[i]);
- }
- vec_a.push_back(k);
- vec_e.push_back(k % 2);
- }
- if (x != 1)
- continue;
- bool fl = true;
- for (long long i = 0; i < last_a.size(); i++)
- for (long long j = 0; j < last_a[i].size(); j++)
- if (last_a[i][j] == b)
- {
- fl = false;
- break;
- }
- if (fl)
- {
- last_a[b] = vec_a;
- last_e[b] = vec_e;
- }
- }
- vector<long long> vec;
- for (auto it1 = last_e.begin(); it1 != last_e.end(); ++it1)
- { bool flag = false;
- for (auto it = last_e.begin(); it != last_e.end(); ++it)
- {
- if ((*it1).first != (*it).first && (*it1).second == (*it).second)
- {
- if (!flag)
- {
- vec.push_back((*it1).first);
- flag = true;
- }
- vec.push_back((*it).first);
- }
- }
- if (vec.size() != 0)
- break;
- }
- if (vec.size() == 0)
- continue;
- long long w = 1;
- for (long long p = 0; p < vec.size(); p++)
- w *= vec[p];
- w %= n;
- long long h = 1, d = 0;
- for (long long i = 0; i < base.size(); i++)
- {
- long long s = 0;
- for (long long p = 0; p < vec.size(); p++)
- s += last_a[vec[p]][d];
- h *= (pow(base[i], int(s / 2)));
- d++;
- }
- h %= n;
- if(w % n != h%n && w % n != ((-h + n ) % n+n) % n){
- long long f = gcd(w + h, n);
- long long e = gcd(w - h, n);
- if (f*e != n)
- continue;
- ans.push_back(f);
- ans.push_back(e);
- break;
- }
- }
- }
- int main()
- {
- long long n;
- cin >> n;
- init_base(n);
- faktor(n);
- for (long long p = 0; p < ans.size(); p++)
- cout << ans[p] << " " << endl;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement