Mail.Ru Cup 2018 Round 3 B. Divide Candies

本文探讨了在特定模数条件下求解平方和为零的整数解问题,提出了一种有效的算法,通过预处理模数范围内的解,进而计算满足条件的方案总数。该方法避免了直接遍历所有可能值的高复杂度,适用于大规模数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接
分析一下题意可以得到题目要求的是满足下面这个 公式的不同的i,ji,jij的方案数;
(i2+j2)mod   m=0 (n ≤ i,j≤ n)(i^2+j^2)\mod \ m =0\ ( n\ \leq\ i,j\leq \ n)(i2+j2)mod m=0 (n  i,j n).
当然n2n^2n2是可以解决的,但是数据范围不允许我们这么做,于是我们可以换个思路,如果一个数iii满足 imod  m=0\ i\mod m=0 imodm=0,那么(i+k∗m)(i+k*m)%m(i+km)也必然是等于000的,因为任意一个数xx%mx的结果必然是小于mmm的,于是我们可以m2m^2m2的复杂度来解决这个问题。在mmm的范围内找出所有满足题意的i,ji,ji,j。然后对每一对i,ji,ji,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;
}

转载于:https://www.cnblogs.com/pubgoso/p/10759698.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值