倍增MLE60pts求调
查看原帖
倍增MLE60pts求调
551559
sEa1nn013uR1o楼主2024/9/8 22:02
#include <bits/stdc++.h>
using namespace std;
int f[1000005][20],a[1000005],n,m,ans2;
inline int read(){
    int x = 0,f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9'){
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0',ch = getchar();
    return x * f;
}
void write(int x){
    if (x < 0) putchar('-'),x = -x;
    if (x > 9) write(x / 10);
    putchar(x % 10 + '0');
}
int main(){
	n = read();
    m = read();
	for (int i = 1;i <= n;i++){
		a[i] = read();
		f[i][0] = a[i];
	}
	for (int i = 1;i <= 20;i++){
		int tmp = pow(2,i);
		for (int j = 1;j + tmp <= n + 1;j++) f[j][i] = f[j][i - 1] * f[j + (int)pow(2,i - 1)][i - 1] % 1145141;
	}
	for (int i = 1;i <= m;i++){
		int l,r;
		l = read();
        r = read();
		int len = r - l + 1,ans = 1,k = 0;
		while (len){
			if (len % 2 == 1){
				ans = ans * f[l][k] % 1145141;
				l += pow(2,k);
			}
			k++;
			len /= 2;
		}
		ans2 ^= ans;
	}
	write(ans2);
	return 0;
}

感谢大佬指教

2024/9/8 22:02
加载中...