(i*i+j*j)%m==0等效于 (i%m*i%m+j%m*j%m)%m==0,
这样把 i,j的范围缩小了 ,代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
using namespace std;
long long number[1001],sum;
int a[1001][1001];
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<=m-1;i++)
for(int j=0;j<=m-1;j++)
{
if((i*i+j*j)%m==0) a[i][j]=1;
}
int sum1=n/m;
for(int i=0;i<=m-1;i++)
number[i]=sum1;
sum1=n%m;
for(int i=1;i<=sum1;i++)
number[i]++;
for(int i=0;i<=m-1;i++)
for(int j=0;j<=m-1;j++)
{
if(a[i][j]==1) sum+=number[i]*number[j];
}
cout<<sum<<endl;
return 0;
}