为什么 WA!,我写的是用费马小定理(好像叫这个,即 ap=a mod p)求逆元,并运用前缀和,代码:
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;
}