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;
}

 

posted @ 2025-05-12 20:09  我微笑不代表我快乐  阅读(10)  评论(0)    收藏  举报