Remainder Problem
# CF1207F Remainder Problem
## 题目描述
给你一个长度为 $500000$ 的序列,初值为 $0$ ,你要完成 $q$ 次操作,操作有如下两种:
1. `1 x y` : 将下标为 $x$ 的位置的值加上 $y$
2. `2 x y` : 询问所有下标模 $x$ 的结果为 $y$ 的位置的值之和
## 输入格式
第一行一个整数 $q$ ,表示操作数。($q\leqslant500000$)
接下来 $q$ 行,每行三个整数 $t,x,y$ 表示一次操作。($t\in\{1,2\}$)
若 $t=1$ 则为第一种操作,保证:
$1\leqslant x\leqslant500000,-1000\leqslant y\leqslant1000$
若 $t=2$ 则为第二种操作,保证:
$1\leqslant x\leqslant500000,0\leqslant y<x$
数据保证至少有一个操作 $2$ 。
## 输出格式
每行对于每个操作 $2$ 输出一个整数表示答案。
## 输入输出样例 #1
### 输入 #1
```
5
1 3 4
2 3 0
2 4 3
1 4 -4
2 1 0
```
### 输出 #1
```
4
4
0
```

#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)
//1 x y:代表将第x 个位置上的数字增加y
{
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;
}

浙公网安备 33010602011771号