| 比赛 |
寒假集训4 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
数据结构题 |
最终得分 |
100 |
| 用户昵称 |
终焉折枝 |
运行时间 |
15.990 s |
| 代码语言 |
C++ |
内存使用 |
191.19 MiB |
| 提交时间 |
2026-02-28 09:06:54 |
显示代码纯文本
#include<iostream>
using namespace std;
#define int long long
const int MAXN = 2 * 1e7 + 5;
int pri[MAXN], phi[MAXN];
bool vis[MAXN];
int n, m, a[MAXN];
int sum[MAXN], tot = 0;
void init(){
phi[1] = 1;
for(int i = 2;i < MAXN;i ++){
if(!vis[i]){
pri[++ tot] = i;
phi[i] = i - 1;
}
for(int j = 1;j <= tot && i * pri[j] < MAXN;j ++){
vis[i * pri[j]] = 1;
if(i % pri[j] == 0){
phi[i * pri[j]] = phi[i] * pri[j];
break;
}
else phi[i * pri[j]] = phi[i] * (pri[j] - 1);
}
}
// for(int i = 1;i <= 10;i ++) cout << phi[i] << ' ';
}
int lowbit(int x){
return x & -x;
}
void add(int x, int k){
while(x <= n){
sum[x] += k;
x += lowbit(x);
}
}
int ask(int x){
int res = 0;
while(x){
res += sum[x];
x -= lowbit(x);
}
return res;
}
int qpow(int a, int b, int p){
int res = 1;
bool flag = 0;
if(a >= p){
a %= p;
flag = 1;
}
while(b){
if(b & 1) res = res * a;
if(res >= p){
flag = 1;
res %= p;
}
a = a * a;
if(a >= p){
a %= p;
flag = 1;
}
b >>= 1;
}
return flag ? res % p + p : res;
}
int solve(int l, int r, int p){
int val = a[l] + ask(l);
if(p == 1) return 1;
if(l == r) return val >= p ? val % p + p : val;
int cnt = solve(l + 1, r, phi[p]);
return qpow(val, cnt, p);
}
signed main(){
freopen("sjjgt.in", "r", stdin);
freopen("sjjgt.out", "w", stdout);
init();
cin >> n >> m;
for(int i = 1;i <= n;i ++){
cin >> a[i];
}
for(int i = 1;i <= m;i ++){
int op, l, r, x;
cin >> op >> l >> r >> x;
if(op == 1) add(l, x), add(r + 1, -x);
else cout << solve(l, r, x) % x << '\n';
}
return 0;
}