Advertisement
Guest User

Untitled

a guest
Apr 21st, 2015
375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <fstream>
  4. #include <vector>
  5. #include <string>
  6. #include <math.h>
  7. #include <cmath>
  8. #include <set>
  9. #include <map>
  10. #include <cassert>
  11. #include <algorithm>
  12. #include <ctime>
  13. #include <iomanip>
  14. #include <unordered_map>
  15. //#include <thread>
  16.  
  17. using namespace std;
  18.  
  19. #define mp make_pair
  20. #define sz size()
  21. #define all(x) x.begin(),x.end()
  22. #define forn(i,n) for (int i = 0; i<int(n); i++)
  23. typedef long long ll;
  24. typedef long double ld;
  25. typedef pair<int, int> ii;
  26. const ll INF = 1e15 + 7;
  27. const ld EPS = 1e-14;
  28.  
  29. ll diskret_logarifm(ll a, ll b, ll m){
  30.     ll n = (ll)sqrt((ld)m) + 1; // a^(p*n-q) = b(mod m) => a^(p*n) = b*a^q(mod m)  p - переменная
  31.  
  32.     ll an = 1; // a^n mod m
  33.     for (int i = 0; i < n; i++)
  34.         an = (an*a) % m;
  35.  
  36.     unordered_map<int, int> vals;
  37.     for (ll i = 1, cur = an; i <= n; i++){
  38.         if (!vals.count(cur))
  39.             vals[cur] = i;
  40.         cur = (cur*an) % m;
  41.     }
  42.  
  43.     for (ll i = 0, cur = b; i <= n; i++){
  44.         if (vals.count(cur)){
  45.             ll ans = vals[cur] * n - i; // p*n-q
  46.             if (ans < m)
  47.                 return ans;
  48.         }
  49.         cur = (cur*a) % m;
  50.     }
  51.  
  52.     return -1;
  53. }
  54.  
  55. void solve_interval(ll p, ll a, ll l, ll r){
  56.     vector<int> ans;
  57.     for (int cur = l; cur <= r; cur++){
  58.         if (diskret_logarifm(a, cur, p) != -1)
  59.             ans.push_back(cur);
  60.     }
  61.  
  62.     for (int i = 0; i < ans.size(); i++)
  63.         printf("%d ", ans[i]);
  64. }
  65.  
  66. void solve_powers(ll p, ll a, ll l, ll r){
  67.     unordered_map<int, bool> M;
  68.     vector<int> ans;
  69.  
  70.     ll cur = 1;
  71.     int cnter = 0;
  72.     while (!M.count(cur)){
  73.         cnter++;
  74.         M[cur] = true;
  75.         if (cur >= l && cur <= r)
  76.             ans.push_back(cur);
  77.         cur = (cur*a) % p;
  78.     }
  79.  
  80.     sort(all(ans));
  81.     for (int i = 0; i < ans.size(); i++)
  82.         printf("%d ", ans[i]);
  83. }
  84.  
  85. //#define DEBUG
  86. int main(){
  87. #ifdef DEBUG
  88.     freopen("input.txt", "r", stdin);
  89.     freopen("output.txt", "w", stdout);
  90. #else
  91.     freopen("list-powers.in", "r", stdin);
  92.     freopen("list-powers.out", "w", stdout);
  93. #endif
  94.  
  95.     ll p, a, l, r;
  96.     cin >> p >> a >> l >> r;
  97.     if (r - l <= 1001){
  98.         solve_interval(p, a, l, r);
  99.     }
  100.     else{
  101.         solve_powers(p, a, l, r);
  102.     }
  103.  
  104. #ifdef DEBUG
  105.     cerr << "Time elapsed: " << (ld)clock() / CLOCKS_PER_SEC << " sec." << endl;
  106. #endif
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement