Mail.Ru Cup 2018 Round 3 B. Divide Candies

题目链接
分析一下题意可以得到题目要求的是满足下面这个 公式的不同的 i j i,j ij的方案数;
( i 2 + j 2 ) m o d &ThinSpace;&ThinSpace; <mtext>   </mtext> m = 0 <mtext>   </mtext> ( n <mtext>   </mtext> <mtext>   </mtext> i , j <mtext>   </mtext> n ) (i^2+j^2)\mod \ m =0\ ( n\ \leq\ i,j\leq \ n) (i2+j2)mod m=0 (n  i,j n).
当然 n 2 n^2 n2是可以解决的,但是数据范围不允许我们这么做,于是我们可以换个思路,如果一个数 i i i满足 <mtext>   </mtext> i m o d &ThinSpace;&ThinSpace; m = 0 \ i\mod m=0  imodm=0,那么 ( i + k m ) (i+k*m)%m (i+km)也必然是等于 0 0 0的,因为任意一个数 x x%m x的结果必然是小于 m m m的,于是我们可以 m 2 m^2 m2的复杂度来解决这个问题。在 m m m的范围内找出所有满足题意的 i , j i,j i,j。然后对每一对 i , j i,j i,j 进行累加贡献。然后这个问题就解决了。

#include<bits/stdc++.h>

#define LL long long
#define fi first
#define se second
#define mp make_pair
#define pb push_back

using namespace std;

LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
LL lcm(LL a,LL b){return a/gcd(a,b)*b;}
LL powmod(LL a,LL b,LL MOD){LL ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
const int N = 2e5 +11;
LL n,m,ans;
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=0;i<m;i++){
		for(int j=0;j<m;j++){
			if((i*i+j*j)%m==0&&i<=n&&j<=n){
				LL a=(n-i)/m+1,b=(n-j)/m+1;
				if(!i)a--;
				if(!j)b--;
				ans+=a*b;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:46
点赞 评论 收藏
分享
可可可可可_:nb啊,看样子是专科玩了几年随便专升本了个民办,又玩了两年。你这能找到我吃
点赞 评论 收藏
分享
11-15 19:28
已编辑
蚌埠坦克学院 硬件开发
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务