B 3645 数列前缀和2 题解
题意很简洁清晰,就不简述了
解题思路
考虑每次询问的式子
然后考虑模数,根据乘法逆元的定义(不会的请先移步 P3811),在模
AC Code
#include <bits/stdc++.h>
using namespace std;
const long long mod = 1145141;
int n, q;
long long a[1000001], sum[1000001], f[1200000];
int main(){
scanf("%d%d", &n, &q);
for (int i=1; i<=n; i++) scanf("%d", &a[i]);
sum[0] = 1;
for (int i=1; i<=n; i++) sum[i] = (sum[i - 1] * a[i]) % mod;
f[1] = 1;
for (int i=2; i<=mod; i++) f[i] = ((mod - mod / i) * f[mod % i]) % mod;
int l, r;
long long ans = 0;
while (q--){
scanf("%d%d", &l, &r);
ans ^= (sum[r] * f[sum[l - 1]]) % mod;
}
printf("%lld\n", ans);
return 0;
}