题意不挂了,直接来做法:
正确:因为n%m的结果一定在0~m-1.且n%m的结果每过m是一个循环.
所以令n%m=i,在n个数中,i共有n/m或n/m+1(如果n%m>=i,则要+1)个.
下面m2复杂度,如果(ii+jj) % m == 0 则是我们要找的,答案+a[i]*a[j]
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long a[2000];
int main(){
long long n,m;
cin>>n>>m;
memset(a,0,sizeof(a));
//
for(int i =0;i < m;i ++)
a[i] += n/m;
//
for(int i = 1;i<= n%m ;i++)
a[i]+=1;
long long sum =0;
for(int i = 0;i < m;i++)
for(int j = 0;j < m;j++)
if ( (i*i+j*j) % m ==0 )
sum+=a[i]*a[j];
cout<<sum<<endl;
return 0;
}
但是,在得到正确答案之前wa了十发,原因至今没有找到:
原先的做法是
for(int i = 0;i <m;i++)
a[i*i%m] = n/m;
for(int i = 1 ;i <=n%m;i++)
a[i]++;
for(int i = 0;i<min(m,n);i++);
for(int j = 0;j <min(m,n);j++)
if((i+j)%m==0)
sum+= a[i]*a[j];
1.我直接处理了i*i%m的值,这样不应该更简便吗?可能是模的性质运用错误,但半夜不清醒,明天尽量找到
2.在m2查找答案的时候,如果n<m呢?大于n的那部分不是应该取不到吗?为什么加上min反而错了??