ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

同余方程 A^x = B (mod C)的解 - BSGS/exBSGS - 洛谷BSGS题单

2021-07-21 09:58:52  阅读:243  来源: 互联网

标签:洛谷 int res exBSGS return mod BSGS ll define


文章目录

这波不写详解了,OI-Wiki有详解。

思路其实很简单,先用hash表存一部分计算结果,然后枚举另一半,同时查找是否存在解。

模板

inline ll mul(ll a, ll b, ll p) { return (a * b - (ll)((long double)a / p * b) * p + p) % p; } 

inline ll qpow(ll x, ll m, ll mod, ll res = 1) {
	for ( ; m; m >>= 1, x = mul(x, x, mod)) if (m & 1) res = mul(res, x, mod);
	return res;
}

inline void exgcd(ll a, ll b, ll &g, ll &x, ll &y) {
	if (b) exgcd(b, a % b, g, y, x), y -= a / b * x;
	else x = 1, y = 0, g = a;
}

inline ll inv(ll x, ll m) {
	ll a, b, g; 
	exgcd(x, m, g, a, b);
	return (a % m + m) % m;
}

map<ll, ll> bs;
inline ll BSGS(ll a, ll b, ll p) { // (a, p) = 1
    if (b == 1 || p == 1) return 0;
	ll m = sqrt(p) + 1; bs.clear();
	for (ll k = 0, t = b; k <= m; k ++, t = mul(t, a, p)) bs[t] = k;
	for (ll x = 1, t = qpow(a, m, p), base = t; x <= m; x ++, t = mul(t, base, p)) 
		if (bs.count(t)) return ((x * m - bs[t]) % p + p) % p;
	return -1;
}

inline ll exBSGS(ll a, ll b, ll c) {
	a %= c, b %= c;
	if (b == 1 || c == 1) return 0;
	ll g = __gcd(a, c), k = 0, t = 1, res;
	while (g ^ 1LL) {
		if (b % g) return -1;
		c /= g, b /= g, t = mul(t, (a / g), c), k ++;
		if (t == b) return k;
		g = __gcd(a, c);
	}
	b = b * inv(t, c) % c, res = BSGS(a, b, c);
    return ~res ? res + k : res;
}

题目(来自洛谷的BSGS题单)

洛谷题单链接


然鹅,本蒟蒻会写的题过于模板。。。

[TJOI2007] 可爱的质数/【模板】BSGS

// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx,avx2,fma")

#include <bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define fin freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout)
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ld nd << 1
#define rd nd << 1 | 1

typedef vector<int> vec;
// typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128_t i128;

// const int mod = 1e9 + 7;
// const int mod = 998244353;
const int maxn = 1e6 + 50;
const int inf = 0x3f3f3f3f;			// 1e9;
const ll INF = 0x3f3f3f3f3f3f3f3f;	// 1e18;

ll n, b, p;
map<ll, int> bsgs;

inline ll qpow(ll x, ll m, ll mod, ll res = 1) {
	for ( ; m; m >>= 1, x = x * x % mod) if (m & 1) res = res * x % mod;
	return res;
}

int main() {
	scanf("%lld%lld%lld", &p, &b, &n);
	int m = sqrt(p) + 1;
	for (ll k = 0, t = n % p; k <= m; k ++, t = t * b % p) bsgs[t] = k;
	for (ll x = 1, t = qpow(b, m, p), base = t; x <= m; x ++, t = t * base % p) 
		if (bsgs.count(t)) printf("%lld\n", x * m - bsgs[t]), exit(0);	
	return cout << "no solution", 0;
}

[SDOI2011]计算器

全是板子。。。

// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx,avx2,fma")

#include <bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define fin freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout)
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ld nd << 1
#define rd nd << 1 | 1

typedef vector<int> vec;
// typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128_t i128;

// const int mod = 1e9 + 7;
// const int mod = 998244353;
const int maxn = 1e6 + 50;
const int inf = 0x3f3f3f3f;			// 1e9;
const ll INF = 0x3f3f3f3f3f3f3f3f;	// 1e18;

int T, op;

inline ll qpow(ll x, ll m, ll mod, ll res = 1) {
	for ( ; m; m >>= 1, x = x * x % mod) if (m & 1) res = res * x % mod;
	return res;
}

inline void exgcd(ll a, ll b, ll &g, ll &x, ll &y) {
	if (b) {
		exgcd(b, a % b, g, x, y);
		swap(x, y), y -= a / b * x;
	} else {
		x = 1, y = 0, g = a;
	}
}

inline ll inv(ll x, ll m) {
	ll a, b, g; 
	exgcd(x, m, g, a, b);
	return (a % m + m) % m;
}

map<ll, ll> bs;
ll bsgs(ll a, ll b, ll c) {
	if (b == 1 || c == 1) return 0;
	ll g = __gcd(a, c), k = 0, t = 1;
	while (g ^ 1LL) {
		if (b % g) return -1;
		c /= g, b /= g, t = t * (a / g) % c, k ++;
		if (t == b) return k;
		g = __gcd(a, c);
	}
	b = b * inv(t, c) % c;

	ll m = sqrt(c) + 1; bs.clear();
	for (ll k = 0, t = b; k <= m; k ++, t = t * a % c) bs[t] = k;
	for (ll x = 1, t = qpow(a, m, c), base = t; x <= m; x ++, t = t * base % c) 
		if (bs.count(t)) return  ((x * m - bs[t]) % c + c) % c + k;
	return -1;
}

int main() {
	ll y, z, p, ans = 1;
	scanf("%d %d", &T, &op);
	switch (op) {
		case 1: {
			while (T -- ) {
				scanf("%lld%lld%lld", &y, &z, &p);
				printf("%lld\n", qpow(y % p, z, p));
			}
		}; break;
		case 2: {
			while (T -- ) {
				scanf("%lld%lld%lld", &y, &z, &p);
				ll g, a, b; exgcd(y, p, g, a, b);
				if (z % g) puts("Orz, I cannot find x!");
				else printf("%lld\n", (a * (z / g) % p + p) % p);
			}
		}; break;
		case 3: {
			while (T -- ) {
				scanf("%lld%lld%lld", &y, &z, &p);
				ans = bsgs(y % p, z % p, p);
				if (ans == -1) puts("Orz, I cannot find x!");
				else printf("%lld\n", ans);
			}
		}; break;
	}
	return 0;
}

多少个1?

等比求个和,变板子了

// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx,avx2,fma")

#include <bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define fin freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout)
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ld nd << 1
#define rd nd << 1 | 1

typedef vector<int> vec;
// typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128_t i128;

// const int mod = 1e9 + 7;
// const int mod = 998244353;
const int maxn = 1e6 + 50;
const int inf = 0x3f3f3f3f;			// 1e9;
const ll INF = 0x3f3f3f3f3f3f3f3f;	// 1e18;

int T, op;

inline ll mul(ll a, ll b, ll mod, ll res = 0) {
	for ( ; b; b >>= 1, a = (a + a) % mod) if (b & 1) res = (res + a) % mod;
	return res;
}

inline ll qpow(ll x, ll m, ll mod, ll res = 1) {
	for ( ; m; m >>= 1, x = mul(x, x, mod)) if (m & 1) res = mul(res, x, mod);
	return res;
}

inline void exgcd(ll a, ll b, ll &g, ll &x, ll &y) {
	if (b) {
		exgcd(b, a % b, g, x, y);
		swap(x, y), y -= a / b * x;
	} else {
		x = 1, y = 0, g = a;
	}
}

inline ll inv(ll x, ll m) {
	ll a, b, g; 
	exgcd(x, m, g, a, b);
	return (a % m + m) % m;
}

map<ll, ll> bs;
ll bsgs(ll a, ll b, ll c) {
	if (b == 1 || c == 1) return 0;
	/* ll g = __gcd(a, c), k = 0, t = 1;
	while (g ^ 1LL) {
		if (b % g) return -1;
		c /= g, b /= g, t = mul(t, (a / g), c), k ++;
		if (t == b) return k;
		g = __gcd(a, c);
	}
	b = b * inv(t, c) % c; */

	ll m = sqrt(c) + 1; bs.clear();
	for (ll k = 0, t = b; k <= m; k ++, t = mul(t, a, c)) bs[t] = k;
	for (ll x = 1, t = qpow(a, m, c), base = t; x <= m; x ++, t = mul(t, base, c)) 
		if (bs.count(t)) return ((x * m - bs[t]) % c + c) % c;
	return -1;
}

int main() {
	ll k, m, ans; 
	scanf("%lld %lld", &k, &m);
	ans = bsgs(10LL % m, (9LL * k + 1LL) % m, m);
	printf("%lld", ans);
	return 0;
}

[SDOI2013] 随机数生成器

特判,特判,特判!!!

// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx,avx2,fma")

#include <bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define fin freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout)
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ld nd << 1
#define rd nd << 1 | 1

typedef vector<int> vec;
// typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128_t i128;

// const int mod = 1e9 + 7;
// const int mod = 998244353;
const int maxn = 1e6 + 50;
const int inf = 0x3f3f3f3f;			// 1e9;
const ll INF = 0x3f3f3f3f3f3f3f3f;	// 1e18;

int T, op;

/* inline ll mul(ll a, ll b, ll mod, ll res = 0) {
	for ( ; b; b >>= 1, a = (a + a) % mod) if (b & 1) res = (res + a) % mod;
	return res;
} */

inline ll mul(ll a, ll b, ll mod) { return a * b % mod; } 

inline ll qpow(ll x, ll m, ll mod, ll res = 1) {
	for ( ; m; m >>= 1, x = mul(x, x, mod)) if (m & 1) res = mul(res, x, mod);
	return res;
}

inline void exgcd(ll a, ll b, ll &g, ll &x, ll &y) {
	if (b) {
		exgcd(b, a % b, g, x, y);
		swap(x, y), y -= a / b * x;
	} else {
		x = 1, y = 0, g = a;
	}
}

inline ll inv(ll x, ll m) {
	ll a, b, g; 
	exgcd(x, m, g, a, b);
	return (a % m + m) % m;
}

map<ll, ll> bs;
ll bsgs(ll a, ll b, ll c) {
	if (b == 1 || c == 1) return 0;
	/* ll g = __gcd(a, c), k = 0, t = 1;
	while (g ^ 1LL) {
		if (b % g) return -1;
		c /= g, b /= g, t = mul(t, (a / g), c), k ++;
		if (t == b) return k;
		g = __gcd(a, c);
	}
	b = b * inv(t, c) % c; */

	ll m = sqrt(c) + 1; bs.clear();
	for (ll k = 0, t = b; k <= m; k ++, t = mul(t, a, c)) bs[t] = k;
	for (ll x = 1, t = qpow(a, m, c), base = t; x <= m; x ++, t = mul(t, base, c)) 
		if (bs.count(t)) return ((x * m - bs[t]) % c + c) % c;
	return -1;
}

int main() {
	ll p, a, b, x1, t, ans;
	scanf("%d", &T);
	while (T -- ) {
		scanf("%lld%lld%lld%lld%lld", &p, &a, &b, &x1, &t);

		if (x1 == t) {
			puts("1");
			continue;
		}

		if (a == 0LL) {
			if (b == t) puts("2");
			else puts("-1");
			continue;
		}

		if (a == 1LL) {
			if (b == 0) puts("-1");
			else {
				ans = qpow(b, p - 2, p) * ((t - x1) % p + p) % p;
				printf("%lld\n", ans + 1);
			}
			continue;
		}

		ll u = (t * (a - 1) + b) % p;
		ll d = (x1 * (a - 1) + b) % p;
		ans = bsgs(a, u * qpow(d, p - 2, p) % p, p);
		if (ans == -1) puts("-1");
		else printf("%lld\n", ans + 1);
	}
	return 0;
}

【模板】扩展 BSGS/exBSGS

// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx,avx2,fma")

#include <bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define fin freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout)
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ld nd << 1
#define rd nd << 1 | 1

typedef vector<int> vec;
// typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
// typedef __int128_t i128;

// const int mod = 1e9 + 7;
// const int mod = 998244353;
const int maxn = 1e6 + 50;
const int inf = 0x3f3f3f3f;			// 1e9;
const ll INF = 0x3f3f3f3f3f3f3f3f;	// 1e18;

int T;

inline ll lcm(ll a, ll b) { return a / __gcd(a, b) * b; }

/* inline ll mul(ll a, ll b, ll mod, ll res = 0) {
	for ( ; b; b >>= 1, a = (a + a) % mod) if (b & 1) res = (res + a) % mod;
	return res;
} */

inline ll mul(ll a, ll b, ll mod) { return a * b % mod; } 

inline ll qpow(ll x, ll m, ll mod, ll res = 1) {
	for ( ; m; m >>= 1, x = mul(x, x, mod)) if (m & 1) res = mul(res, x, mod);
	return res;
}

inline void exgcd(ll a, ll b, ll &g, ll &x, ll &y) {
	if (b) exgcd(b, a % b, g, y, x), y -= a / b * x;
	else x = 1, y = 0, g = a;
}

inline ll inv(ll x, ll m) {
	ll a, b, g; 
	exgcd(x, m, g, a, b);
	return (a % m + m) % m;
}

map<ll, ll> bs;
inline ll BSGS(ll a, ll b, ll p) { // (a, p) = 1
    if (b == 1 || p == 1) return 0;
	ll m = sqrt(p) + 1; bs.clear();
	for (ll k = 0, t = b; k <= m; k ++, t = mul(t, a, p)) bs[t] = k;
	for (ll x = 1, t = qpow(a, m, p), base = t; x <= m; x ++, t = mul(t, base, p)) 
		if (bs.count(t)) return ((x * m - bs[t]) % p + p) % p;
	return -1;
}

inline ll exBSGS(ll a, ll b, ll c) {
	a %= c, b %= c;
	if (b == 1 || c == 1) return 0;
	ll g = __gcd(a, c), k = 0, t = 1, res;
	while (g ^ 1LL) {
		if (b % g) return -1;
		c /= g, b /= g, t = mul(t, (a / g), c), k ++;
		if (t == b) return k;
		g = __gcd(a, c);
	}
	b = b * inv(t, c) % c, res = BSGS(a, b, c);
    return ~res ? res + k : res;
}

ll a, b, p, ans;

int main() {
	while (~scanf("%lld%lld%lld", &a, &p, &b) && (a || b || p)) {
		if (~(ans = exBSGS(a, b, p))) printf("%lld\n", ans);
		else puts("No Solution");
	}
	return 0;
}

【XR-1】快乐肥宅

BSGS求出特解(可能无解或者为唯一解),再用CRT合并答案即可(可能会爆long long)。

好毒瘤,枯了,先咕了。


[CQOI2018]破解D-H协议

// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx,avx2,fma")

#include <bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define fin freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout)
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ld nd << 1
#define rd nd << 1 | 1

typedef vector<int> vec;
// typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
// typedef __int128_t i128;

// const int mod = 1e9 + 7;
// const int mod = 998244353;
const int maxn = 1e6 + 50;
const int inf = 0x3f3f3f3f;			// 1e9;
const ll INF = 0x3f3f3f3f3f3f3f3f;	// 1e18;

int T;

inline ll lcm(ll a, ll b) { return a / __gcd(a, b) * b; }

/* inline ll mul(ll a, ll b, ll mod, ll res = 0) {
	for ( ; b; b >>= 1, a = (a + a) % mod) if (b & 1) res = (res + a) % mod;
	return res;
}  */

inline ll mul(ll a, ll b, ll p) { return (a * b - (ll)((long double)a / p * b) * p + p) % p; } 

inline ll qpow(ll x, ll m, ll mod, ll res = 1) {
	for ( ; m; m >>= 1, x = mul(x, x, mod)) if (m & 1) res = mul(res, x, mod);
	return res;
}

inline void exgcd(ll a, ll b, ll &g, ll &x, ll &y) {
	if (b) exgcd(b, a % b, g, y, x), y -= a / b * x;
	else x = 1, y = 0, g = a;
}

inline ll inv(ll x, ll m) {
	ll a, b, g; 
	exgcd(x, m, g, a, b);
	return (a % m + m) % m;
}

map<ll, ll> bs;
inline ll BSGS(ll a, ll b, ll p) { // (a, p) = 1
    if (b == 1 || p == 1) return 0;
	ll m = sqrt(p) + 1; bs.clear();
	for (ll k = 0, t = b; k <= m; k ++, t = mul(t, a, p)) bs[t] = k;
	for (ll x = 1, t = qpow(a, m, p), base = t; x <= m; x ++, t = mul(t, base, p)) 
		if (bs.count(t)) return ((x * m - bs[t]) % p + p) % p;
	return -1;
}

inline ll exBSGS(ll a, ll b, ll c) {
	a %= c, b %= c;
	if (b == 1 || c == 1) return 0;
	ll g = __gcd(a, c), k = 0, t = 1, res;
	while (g ^ 1LL) {
		if (b % g) return -1;
		c /= g, b /= g, t = mul(t, (a / g), c), k ++;
		if (t == b) return k;
		g = __gcd(a, c);
	}
	b = b * inv(t, c) % c, res = BSGS(a, b, c);
    return ~res ? res + k : res;
}

ll g, p, A, B, K;

int main() {
	scanf("%lld%lld%d", &g, &p, &T);
	while (T -- ) {
		scanf("%lld%lld", &A, &B);
		ll a = exBSGS(g, A, p), b = exBSGS(g, B, p);
		printf("%lld\n", qpow(qpow(g, a, p), b, p));
	}
	return 0;
}

CF1106F Lunar New Year and a Recursive Sequence

用离散对数将表达式转换成一个线性方程,显然先求原根,再矩阵快速幂就好了。

// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx,avx2,fma")

#include <bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define fin freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout)
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ld nd << 1
#define rd nd << 1 | 1

typedef vector<int> vec;
// typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
// typedef __int128_t i128;

// const int mod = 1e9 + 7;
const int mod = 998244353;
const int maxn = 1e6 + 50;
const int inf = 0x3f3f3f3f;			// 1e9;
const ll INF = 0x3f3f3f3f3f3f3f3f;	// 1e18;

int T;

inline ll lcm(ll a, ll b) { return a / __gcd(a, b) * b; }

/* inline ll mul(ll a, ll b, ll mod, ll res = 0) {
	for ( ; b; b >>= 1, a = (a + a) % mod) if (b & 1) res = (res + a) % mod;
	return res;
}  */

inline ll mul(ll a, ll b, ll p) { return (a * b - (ll)((long double)a / p * b) * p + p) % p; } 

inline ll qpow(ll x, ll m, ll mod, ll res = 1) {
	for ( ; m; m >>= 1, x = mul(x, x, mod)) if (m & 1) res = mul(res, x, mod);
	return res;
}

inline void exgcd(ll a, ll b, ll &g, ll &x, ll &y) {
	if (b) exgcd(b, a % b, g, y, x), y -= a / b * x;
	else x = 1, y = 0, g = a;
}

inline ll inv(ll x, ll m) {
	ll a, b, g; 
	exgcd(x, m, g, a, b);
	return (a % m + m) % m;
}

map<ll, ll> bs;
inline ll BSGS(ll a, ll b, ll p) { // (a, p) = 1
    if (b == 1 || p == 1) return 0;
	ll m = sqrt(p) + 1; bs.clear();
	for (ll k = 0, t = b; k <= m; k ++, t = mul(t, a, p)) bs[t] = k;
	for (ll x = 1, t = qpow(a, m, p), base = t; x <= m; x ++, t = mul(t, base, p)) 
		if (bs.count(t)) return ((x * m - bs[t]) % p + p) % p;
	return -1;
}

inline ll exBSGS(ll a, ll b, ll c) {
	a %= c, b %= c;
	if (b == 1 || c == 1) return 0;
	ll g = __gcd(a, c), k = 0, t = 1, res;
	while (g ^ 1LL) {
		if (b % g) return -1;
		c /= g, b /= g, t = mul(t, (a / g), c), k ++;
		if (t == b) return k;
		g = __gcd(a, c);
	}
	b = b * inv(t, c) % c, res = BSGS(a, b, c);
    return ~res ? res + k : res;
}

int k;
ll n, m;
ll base[105][105], ans[105][105], tmp[105][105], a[105];

inline void mat_mul(int op, ll p) {
	switch(op) {
		case 1: {
			memset(tmp, 0, sizeof tmp);
			for (int i = 1; i <= k; i++) 
				for (int j = 1; j <= k; j++) 
					for (int o = 1; o <= k; o++) 
						tmp[i][j] = (tmp[i][j] + base[i][o] * base[o][j] % p) % p;
			memcpy(base, tmp, sizeof tmp);
		}; break;
	 	case 2: {
			memset(tmp, 0, sizeof tmp);
			for (int i = 1; i <= k; i++) 
				for (int j = 1; j <= k; j++) 
					for (int o = 1; o <= k; o++) 
						tmp[i][j] = (tmp[i][j] + ans[i][o] * base[o][j] % p) % p;
			memcpy(ans, tmp, sizeof tmp);
		};break;
	}
}

void mat_pow(ll ind, ll p) {
	while (ind) {
		if (ind & 1) mat_mul(2, p);
		mat_mul(1, p), ind >>= 1;
	}
}

int main() {
	scanf("%d", &k);
	for (int i = 1; i <= k; i++) scanf("%lld", &base[1][i]), ans[i][i] = 1LL;
	for (int i = 2; i <= k; i++) base[i][i - 1] = 1LL;
	scanf("%lld %lld", &n, &m);
	mat_pow(n - k, mod - 1);
	ll t = exBSGS(3, m, mod) % (mod - 1);
	// cout << t << '\n';
	ll g, x, y; exgcd(ans[1][1], mod - 1, g, x, y);
	if (t % g) puts("-1");
	else printf("%lld", qpow(3, mul(t / g, (x % (mod - 1) + mod - 1) % (mod - 1), mod - 1), mod));
	return 0;
}

标签:洛谷,int,res,exBSGS,return,mod,BSGS,ll,define
来源: https://blog.csdn.net/qq_41743740/article/details/118946068

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有