Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using ll = long long;
- ll MOD;
- ll _powMod(ll n ,ll p)
- {
- n %= MOD;
- ll x = 1;
- while( p > 0 )
- {
- if( p & 1 ) x = (x * n) % MOD;
- n = (n * n) % MOD;
- p >>= 1;
- }
- return x;
- }
- ll extEuclid(ll a, ll b, ll &x, ll &y)
- {
- ll xx = y = 0;
- ll yy = x = 1;
- while( b )
- {
- ll q = a / b;
- ll t = b; b = a % b; a = t;
- t = xx; xx = x-q*xx; x = t;
- t = yy; yy = y-q*yy; y = t;
- }
- return a;
- }
- ll modInverse(ll b)
- {
- ll x ,y;
- if( extEuclid(b ,MOD ,x ,y) != 1 ) return -1;
- return (x % MOD + MOD) % MOD;
- }
- ll solve(ll a, ll b, ll m)
- {
- a %= m, b %= m;
- ll k = 1, add = 0, g;
- while ((g = gcd(a, m)) > 1)
- {
- if (b == k)
- return add;
- if (b % g)
- return -1;
- b /= g, m /= g, ++add;
- k = (k * 1ll * a / g) % m;
- }
- ll n = sqrt(m) + 1;
- ll an = 1;
- for (ll i = 0; i < n; ++i)
- an = (an * 1ll * a) % m;
- unordered_map<ll, ll> vals;
- for (ll q = 0, cur = b; q <= n; ++q) {
- vals[cur] = q;
- cur = (cur * 1ll * a) % m;
- }
- for (ll p = 1, cur = k; p <= n; ++p) {
- cur = (cur * 1ll * an) % m;
- if (vals.count(cur)) {
- ll ans = n * p - vals[cur] + add;
- return ans;
- }
- }
- return -1;
- }
- int main()
- {
- ll a ,b ,X0 ,Xn;
- scanf("%lld%lld%lld%lld%lld" ,&a ,&b ,&MOD ,&X0 ,&Xn);
- if( X0 == Xn )
- {
- puts("YES");
- return 0;
- }
- ll nome = (((Xn % MOD) - (a * Xn % MOD) + MOD) % MOD - (b % MOD) + MOD) % MOD;
- ll deno = (((X0 % MOD) - (a * X0 % MOD) + MOD) % MOD - (b % MOD) + MOD) % MOD;
- if( solve(a ,nome * modInverse(deno) % MOD ,MOD) == -1 ){
- puts("NO");
- } else {
- puts("YES");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement