艹WA一片,萌新蒟蒻求助
查看原帖
艹WA一片,萌新蒟蒻求助
747401
dfs0ms楼主2023/1/30 17:34

为什么 WA!,我写的是用费马小定理(好像叫这个,即 ap=aa^p=a modmod pp)求逆元,并运用前缀和,代码:

f 数组是前缀和,rf 数组是 f 数组的逆元

#include <cstdio>
#include <cmath>
#include <algorithm>
#define int long long
using namespace std;
const int N = 1000010;
const int mod = 1145141;

int n, m, a[N], res;
int f[N], rf[N]; /// f[i] * rf[i] = 1 (mod mod)

int light(int a, int p) /// a ^ p
{
	int ret = 1, base = a;
	while (p)
	{
		if (p & 1) { ret *= base; ret %= mod; }
		base = (base * base) % mod; p >>= 1;
	}
	return ret;
}
signed main()
{
	scanf("%lld%lld", &n, &m);
	for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
	
	f[0] = 1;
	for (int i = 1; i <= n; i++) f[i] = (f[i - 1] * a[i]) % mod;
	for (int i = 1; i <= n; i++) rf[i] = light(f[i], mod - 2);
	
	while (m--)
	{
		int l, r; scanf("%lld%lld", &l, &r);
	/// f[r] / f[l - 1],求 f[l - 1] 的逆元
	    int tmp = (f[r] * rf[l - 1]) % mod;
		res = res ^ tmp;
	}
	printf("%lld\n", res);
	return 0;
}
2023/1/30 17:34
加载中...