题意:给出a,b,范围为[1,n],然后问(a^2+b^2)%m==0的情况有多少个,n<=1e9,m<=1e3
题解:(a^2+b^2)%m=((a^2)%m+(b^2)%m)%m=((a%m*a%m)%m+(b%m*b%m)%m)%m,所以可以通过枚举取余m的情况,然后统计个数即可。
附上代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1050;
int n,m;
int cnt[N];
ll ans;
int main(void){
scanf("%d%d",&n,&m);
//处理出1到n中 %m余数为i的数的个数
//处理前面km个数
for(int i=0;i<m;i++){
cnt[i]=n/m;
}
//处理后面n-km个数
for(int i=(n/m)*m+1;i<=n;i++){
cnt[i%m]++;
}
//枚举余数即可
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
if(((i*i)%m+(j*j)%m)%m==0){
ans+=(ll)cnt[i]*cnt[j];
}
}
}
printf("%lld\n",ans);
return 0;
}