1. 程式人生 > 其它 >Remainder Problem(CF 1207 F)

Remainder Problem(CF 1207 F)

CodeForces - 1207F

題目大意

你有一個長度為\(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;
}