【bzoj1041】[HAOI2008]圆上的整点

n=d*(u^2+v^2),枚举d(从1到sqrt(n)),然后判断n/d和d。再枚举一组u,v,如果gcd(u,v)=1,则是一组可行解。枚举八分之一圆,答案乘以8,再加上4个坐标轴上的点。

 
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
 
typedef long long LL;
 
LL r,n;
LL ans=1;
 
LL gcd (LL a,LL b)
{
    return b==0 ? a : gcd(b,a%b);
}
 
LL work(LL d)
{
    LL k=0,res=2*r/d;
    for (LL i=1;i*i<=res;i++)
    {
        LL t=res-i*i;
        LL v=(LL)sqrt(t+0.5);
        if (i>=v)
            break;
        if (i*i+v*v==res && gcd(i,v)==1)
            k++;
    }
    return k;
}
 
int main()
{
    scanf("%lld",&r);
    n=2*r;
    for (LL i=1;i*i<=n;i++)
        if (n%i==0)
        {
            ans+=work(i);
            if (i*i==n)
                break;
            ans+=work(n/i);
        }
    printf("%lld\n",ans<<2);
    return 0;
}

  

posted @ 2016-03-25 21:02  Yangjiyuan  阅读(59)  评论(0编辑  收藏