求助今日T1
  • 板块学术版
  • 楼主1n1c5c5z
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/1/19 18:30
  • 上次更新2023/10/24 03:35:37
查看原帖
求助今日T1
279743
1n1c5c5z楼主2023/1/19 18:30
#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

const long long mod = 998244353;
long long na[1001], nb[1001];

long long QPow(long long a, long long b)
{
	if (b == 1) return (a + mod) % mod;
	long long ans = 1;
	while (b)
	{
		if (b % 2)
		{
			ans *= a;
			ans = (ans + mod) % mod;
		}
		a = (a * a + mod) % mod;
		b >>= 1;
	}
	return (ans + mod) % mod;
}

void Solve()
{
	int n;
	long long a, b, x, y;
	cin >> n >> a >> b >> x >> y;
	na[1] = a, na[2] = b;
	nb[1] = x, nb[2] = y;
	int placa = n, placb = n;
	for (int i = 3; i <= min(n, 100); i++)
	{
		na[i] = floor(sqrtl((long double)na[i - 1] * na[i - 2])) + 1;
		if (na[i] == na[i - 1]) 
		{
			placa = i;
		}
	}
	for (int i = 3; i <= min(n, 100); i++)
	{
		nb[i] = floor(sqrtl((long double)nb[i - 1] * nb[i - 2])) + 1;
		if (nb[i] == nb[i - 1]) 
		{
			placb = i;
		}
	}
	
	long long ans = 1;
	int plac = min(placa, placb);
	for (int i = 3; i <= min(plac, n) + 1; i++) 
	{
		na[i] = floor(sqrtl((long double)na[i - 1] * na[i - 2])) + 1;
		nb[i] = floor(sqrtl((long double)nb[i - 1] * nb[i - 2])) + 1;
	}
	for (int i = 1; i <= min(plac, n); i++) ans = (ans * (nb[i] - na[i]) + mod) % mod;
	if (n > plac)
	{
		long long base = (nb[plac] - na[plac]) * (nb[plac + 1] - na[plac + 1]);
		ans = (ans * QPow(base, (n - plac) / 2) + mod) % mod;
		if ((n - plac) % 2) ans = (ans * (nb[plac + 1] - na[plac + 1]) + mod) % mod;
	}
	cout << ans << endl;
}

int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		Solve();
	}
}

过了样例,但一直WA 0pts

2023/1/19 18:30
加载中...