Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <string>
- #include <math.h>
- #include <cmath>
- #include <set>
- #include <map>
- #include <cassert>
- #include <algorithm>
- #include <ctime>
- #include <iomanip>
- #include <unordered_map>
- //#include <thread>
- using namespace std;
- #define mp make_pair
- #define sz size()
- #define all(x) x.begin(),x.end()
- #define forn(i,n) for (int i = 0; i<int(n); i++)
- typedef long long ll;
- typedef long double ld;
- typedef pair<int, int> ii;
- const ll INF = 1e15 + 7;
- const ld EPS = 1e-14;
- ll diskret_logarifm(ll a, ll b, ll m){
- ll n = (ll)sqrt((ld)m) + 1; // a^(p*n-q) = b(mod m) => a^(p*n) = b*a^q(mod m) p - переменная
- ll an = 1; // a^n mod m
- for (int i = 0; i < n; i++)
- an = (an*a) % m;
- unordered_map<int, int> vals;
- for (ll i = 1, cur = an; i <= n; i++){
- if (!vals.count(cur))
- vals[cur] = i;
- cur = (cur*an) % m;
- }
- for (ll i = 0, cur = b; i <= n; i++){
- if (vals.count(cur)){
- ll ans = vals[cur] * n - i; // p*n-q
- if (ans < m)
- return ans;
- }
- cur = (cur*a) % m;
- }
- return -1;
- }
- void solve_interval(ll p, ll a, ll l, ll r){
- vector<int> ans;
- for (int cur = l; cur <= r; cur++){
- if (diskret_logarifm(a, cur, p) != -1)
- ans.push_back(cur);
- }
- for (int i = 0; i < ans.size(); i++)
- printf("%d ", ans[i]);
- }
- void solve_powers(ll p, ll a, ll l, ll r){
- unordered_map<int, bool> M;
- vector<int> ans;
- ll cur = 1;
- int cnter = 0;
- while (!M.count(cur)){
- cnter++;
- M[cur] = true;
- if (cur >= l && cur <= r)
- ans.push_back(cur);
- cur = (cur*a) % p;
- }
- sort(all(ans));
- for (int i = 0; i < ans.size(); i++)
- printf("%d ", ans[i]);
- }
- //#define DEBUG
- int main(){
- #ifdef DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #else
- freopen("list-powers.in", "r", stdin);
- freopen("list-powers.out", "w", stdout);
- #endif
- ll p, a, l, r;
- cin >> p >> a >> l >> r;
- if (r - l <= 1001){
- solve_interval(p, a, l, r);
- }
- else{
- solve_powers(p, a, l, r);
- }
- #ifdef DEBUG
- cerr << "Time elapsed: " << (ld)clock() / CLOCKS_PER_SEC << " sec." << endl;
- #endif
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement