这么傻逼的题当时想了那么久
用a数组维护原序列,b[i][j]表示 pos%i=j 的 a[pos]之和
对于每个修改1 x y,先直接修改a[x],然后枚举i=1..700,修改b[i][x%i]
对于每个查询2 x y,如果x>700,那么我们直接去a数组里枚举i=kx+y,
如果x<700,b[x][y]就是答案
#include<bits/stdc++.h> using namespace std; #define N 500005 #define ll long long ll a[N],b[705][705]; int q; int main(){ cin>>q; while(q--){ int op,x,y; scanf("%d%d%d",&op,&x,&y); if(op==1){ a[x]+=y; for(int i=1;i<=700;i++) b[i][x%i]+=y; } if(op==2){ ll ans=0; if(x>700){ for(int i=y;i<=500000;i+=x) ans+=a[i]; } else ans=b[x][y]; cout<<ans<<endl; } } }