Remainder Problem(CF 1207 F)
阿新 • • 發佈:2022-05-22
題目大意
你有一個長度為\(500000\)的陣列,每個位置上的數初始值為\(0\),有\(q\)次操作,每次的操作有兩種:\(1、1\ x\ y\)表示對第\(x\)個位置上的數加\(y\);\(2、2\ x\ y\)表示要求你輸出所有對\(x\)取模後為\(y\)的位置的和。
思路
這題是一個模數分塊,就是當\(x> \sqrt n\)時可以暴力查詢,然後小範圍的時候可以維護\(dp[x][y]\)為所有對\(x\)取模後為\(y\)的位置的和,然後就可以直接輸出答案,然後就結束了。
程式碼
#include<bits/stdc++.h> using namespace std; const int n=sqrt(500000); const int N=n+5; int dp[N][N]; int a[500005]; int main() { int _; scanf("%d",&_); while(_--) { int op,x,y; scanf("%d%d%d",&op,&x,&y); if(op==1) { for(int i=1;i<=n;i++) { dp[i][x%i]+=y; } a[x]+=y; } else { if(x<=n)printf("%d\n",dp[x][y]); else { long long ans=0; for(int i=y;i<=500000;i+=x) { ans+=a[i]; } printf("%d\n",ans); } } } return 0; }