codeforces 1056 B. Divide Candies

题目:
http://codeforces.com/contest/1056/problem/B

题目大意:给你一个nn的棋盘 每一个格子上可以放ii+j*j个糖,现在有m个人,问有多少格子的糖可以整除m

这道题想了很久没想出来…
思路:看见m为1000 应该优先考虑O(mm)的时间复杂度,那么就应该考虑余数。(ii+jj)%m = (ii%m+j*j%m)%m=0 所以我们只需要找到余数相乘为m的数,并把它们的数量相乘加到答案中
这里先统计小于等于m整数倍的数,再把m整数倍到n的数统计。
比如n=8,m=3 先统计1-6 余数为1,2,0的个数都是n/m
再统计7-8的数 余数为1,2的加1

#include<bits/stdc++.h>
#define fi first
#define se second
#define FOR(a) for(int i=0;i<a;i++)
#define sc(a) scanf("%d",&a)
#define show(a) cout<<a<<endl;
#define show2(a,b) cout<<a<<" "<<b<<endl;
#define show3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl;
using namespace std;

typedef long long ll;
typedef pair<int, int> P;
typedef pair<P, int> LP;
const ll inf = 1e17 + 10;
const int N = 3e5 + 10;
const ll mod = 998244353;

map<string, int>ml;



ll b[N], vis[N], po[N],num[N], t, n, m, x, y, k, a[N];
ll ex, ey, cnt, ans, sum, flag;
ll dist[N];
ll dp[N];
deque <int> q;
vector<int> v[N];


int main()
{
	ios::sync_with_stdio ( false );
	cin.tie ( 0 );

	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		num[i]=n/m;
	}
	for(int i=(n/m)*m+1;i<=n;i++)
		num[i%m]++;
	for(int i=0;i<m;i++)
		for(int j=0;j<m;j++)
	{
		if((i*i+j*j)%m==0)
			ans+=num[j]*num[i];
	}
	cout<<ans<<endl;



}

猜你喜欢

转载自blog.csdn.net/weixin_42640692/article/details/86516780