首先我们考虑暴力开一个数组f[i][j] 表示模i余j的位置上数的和
但是数组开不下 , 我们发现当i大于sqrt(n)时 , 只需要sqrt(n)次就可以暴力加
并且当i小于sqrt(n)时 , 就可以预处理 , 修改时暴力修改就可以了
#include<bits/stdc++.h>
#define N 150050
#define M 405
#define LL long long
using namespace std;
int val[N],n,m,siz; char s[3];
LL f[M][M];
int main(){
scanf("%d%d",&n,&m); siz = sqrt(n);
for(int i=1;i<=n;i++){
scanf("%d",&val[i]);
for(int j=1;j<=siz;j++)
f[j][i%j] += (LL)val[i];
}
while(m--){
int x,y; scanf("%s%d%d",s,&x,&y);
if(s[0]=='A'){
if(x <= siz) printf("%lld\n",f[x][y]);
else{
LL ans = 0;
for(int i=y;i<=n;i+=x) ans += (LL)val[i];
printf("%lld\n",ans);
}
}
if(s[0]=='C'){
for(int i=1;i<=siz;i++)
f[i][x%i] += (y-val[x]);
val[x] = y;
}
}return 0;
}