哦哎萌新求助52pts
查看原帖
哦哎萌新求助52pts
716260
SegmentTree_楼主2024/5/1 16:57
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e6+5;
ll qpow(ll a, ll b, ll p){
	ll res = 1;
	while (b){
		if (b & 1) res = a * res % p;
		a = a * a % p;
		b >>= 1;
	}
	return res % p;
}
ll exgcd(ll a, ll b, ll &x, ll &y){
	if (b == 0){
		x = 1, y = 0;
		return a;
	}
	exgcd(b, a % b, x, y);
	ll k = x;
	x = y;
	y = k - a / b * y;
}
void sub1(ll a, ll b, ll p){
	a %= p;
	cout << qpow(a, b, p) << '\n';
}
void sub2(ll a, ll b, ll p){
	a %= p;
	b %= p;
	if (a == 0 && b != 0){
		cout << "Orz, I cannot find x!\n";
	}
	ll x = 0, y = 0;
	ll d = exgcd(a, p, x, y);
	x = (x + p) % p;
	x = (x * b) % p;
	cout << x << '\n';
}
ll bsgs(ll a, ll b, ll p){
	map<ll, ll> mp;
	mp.clear();
	ll sqrtp = sqrt(p) + 1;
	ll c = 1;
	for (ll j = 1;j <= sqrtp;j++){
		c = c * a % p;
		mp[b * c % p] = j;
	} 
	ll a1 = c;
	for (ll i = 1;i <= sqrtp;i++){
		if (mp[a1]) return i * sqrtp - mp[a1];
		a1 = a1 * c % p;
	}
	return -1;
}
void sub3(ll a, ll b, ll p){
	a %= p;
	if (a == 0 && b == 0){
		cout << "1\n";
		return;
	} 
	if (a == 0 && b != 0){
		cout << "Orz, I cannot find x!\n";
		return;
	}
	ll t = bsgs(a, b, p);
	if (t == -1) cout << "Orz, I cannot find x!\n";
	else cout << t << '\n';
}
int main(){
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	int t, k;
	cin >> t >> k;
	while (t--){
		ll a, b, p;
		cin >> a >> b >> p;
		if (k == 1) sub1(a, b, p);
		else if (k == 2) sub2(a, b, p);
		else{
			sub3(a, b, p);	
		}
	}
	return 0;
}
2024/5/1 16:57
加载中...