UVALive 6182 - Ginkgo Numbers

        

     其实是一道挺简单的题,比较重要的信息就是提供的第一条充要条件。
依据这个可以判断【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<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
    //freopen("in.txt","r",stdin);
    int p,q,cas,ans;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d%d",&p,&q);
        ans=0;
        for(int m=-145; m<=145; m++)
        {
            for(int n=-145; n<=145; n++)
            {
                int a=m*m+n*n;
                if(a==0) continue;
                int b=m*p+n*q;
                int c=m*q-n*p;
                if(b%a==0&&c%a==0)
                    ans++;
            }
        }
        if(ans==8)
        cout<<"P"<<endl;
        else cout<<"C"<<endl;
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值