题目链接
分析一下题意可以得到题目要求的是满足下面这个 公式的不同的
i
,
j
i,j
i,j的方案数;
即
(
i
2
+
j
2
)
m
o
d
  
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).
当然
n
2
n^2
n2是可以解决的,但是数据范围不允许我们这么做,于是我们可以换个思路,如果一个数
i
i
i满足
i
m
o
d
  
m
=
0
\ i\mod m=0
imodm=0,那么
(
i
+
k
∗
m
)
(i+k*m)%m
(i+k∗m)也必然是等于
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;
}