快速幂TLE50pts
查看原帖
快速幂TLE50pts
498612
Saka_Noa楼主2023/1/25 23:19
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mod 998244353
int T;
int n, A, B, X, Y;
int f1[4], f2[4];
int ksm(int a, int b) {
	int ans = 1, base = a;
	while(b) {
		if(b & 1) 
		ans = (ans * base) % mod;
		base *= base;
		base %= mod;
		b >>= 1;
	}
	return ans;
} 
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin >> T;
	while(T--) {
		cin >> n >> A >> B >> X >> Y;
		f1[1] = A , f1[2] = B ;
		f2[1] = X , f2[2] = Y ;
		int ans = 1, cnt = 0, last = LONG_MAX;
		for(int i = 1;i <= n;i++) {
			int id = i > 3 ? 3 : i;
			if(i >= 3) f1[3] = (sqrtl(f1[1] * f1[2])) + 1;
			if(i >= 3) f2[3] = (sqrtl(f2[1] * f2[2])) + 1;
			
			if(f2[id] - f1[id] == last) cnt++;
			else {
				last = f2[id] - f1[id];
				cnt = 1;
			}
			if(cnt >= 3) {
				ans *= ksm(last, n - i + 1);
				ans = ((ans % mod) + mod) % mod;
				break;
			}
			ans *= f2[id] - f1[id];
			ans = ((ans % mod) + mod) % mod;
		
			if(i >= 3) f1[1] = f1[2], f1[2] = f1[3];
			if(i >= 3) f2[1] = f2[2], f2[2] = f2[3];
		}
		cout << ans << endl;
	}
	return 0;
} 
2023/1/25 23:19
加载中...