30分,求大佬救我,最后两个测试点TLE
查看原帖
30分,求大佬救我,最后两个测试点TLE
1259452
laugh_taleCF楼主2024/10/26 16:34
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
const int N = 5000010;
int n, p, k;
int fact[N], a[N], infact[N],mi[N];
int ans;
int qmi(int a, int k, int p)
{
	int res = 1;
	while (k)
	{
		if (k & 1) res = (long long)res * a % p;
		k >>= 1;
		a = (long long)a * a % p;
	}
	return res;

}
int main()
{
	scanf("%d%d%d", &n, &p, &k);

	fact[0] = infact[0] = a[0] = 1;
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &a[i]);
		fact[i] = (long long)fact[i - 1] * a[i] % p;
	}
	
	infact[n] = qmi(fact[n], p - 2, p);
	for (int i = n-1; i >= 1; i--)
	{
		infact[i] = (long long)infact[i + 1] * a[i + 1]%p;
	}

	for (int i = 1,j=k; i <= n; i++,j=(long long)j*k%p)
	{
		ans += (long long)j * infact[i] % p * fact[i - 1] % p;
		ans %= p;
	}
	cout << ans << endl;
	return 0;
}

我的想法是,处理出前缀积fact[n]和前缀积的逆元infact[n],这样就能很容易的得出ai的逆元ai^-1=infact[i]*fact[i-1]。然后根据题目要求求和就是答案了。 对于逆元,我们只需要用快速幂求出infact[n],然后再用递推公式infact[i-1]=infact[i]*a[i]就能够求出剩余的逆元,这样所有的时间复杂度都应该是O(n)的,不知道为什么会超时

2024/10/26 16:34
加载中...