其实是一道挺简单的题,比较重要的信息就是提供的第一条充要条件。依据这个可以判断【m,n】是否为【p,q】的因子。
怎么找到这些符合的m,n呢?不用太多技巧,只要挨个数试可以了。
这里要注意 1 < m2 + n2 < 20000 ,那么m或n最大是约是142,最小自然是-142,两个循环,暴力也不会超时。
计算过程中有一点要注意,除数是不能为0的,所以对m2 + n2要特判非0,否则一运行就会出错。
这道题比赛的时候也没做出来。现在想想当时特别认真的读完了题,其实也没读懂,还试图通过找规律来算出m,n来,但是不断经验表明这种统计个数的题用找规律和简单的计算公式往往是不靠谱的。而提供的数据范围是 1 < m2 + n2 < 20000给足了暗示:m,n范围都很小。而3000MS也不算短,这就暗示可以暴力解决了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int p,q;
scanf("%d %d",&p,&q);
int count=0;
for(int i=-142;i<=142;++i)
for(int j=-142;j<=142;++j)
{
long long a=i*i+j*j,b=i*p+j*q,c=i*q-j*p;
if(a&&!(b%a)&&!(c%a)) count++;
}
if(count==8) printf("P\n");
else printf("C\n");
}
return 0;
}