bzoj1041: [HAOI2008]圆上的整点

来源:互联网 发布:厦大网络教学平台登录 编辑:程序博客网 时间:2024/05/22 14:18

题面在这里
emmmm先来吐槽一下下~
%一发dsy上0ms的大佬们。。。
我就比较弱辣要200+ms,,QwQ
做法:
来做一些鬼畜的变形= =
r2=x2+y2
y2=r2x2
y2=(r+x)(rx)
y=(r+x)(rx)
d=gcd(r+x,rx)
a=r+xdb=rxd
y=d2×a×b=da×b
因为ab互质,所以ab是完全平方数
a=A2,b=B2
A2=a=r+xd,B2=b=rxd
两式相加得2rd=A2+B2
所以我们可以考虑枚举d,再枚举A,计算出B,然后判断是否合法,即满足:1) B是整数,2) gcd(A,B)=1
至此,我们求出某一象限内的个数,因为要四个象限,于是答案×4
再加上坐标轴的4个点,于是答案再+4

/*************************************************************    Problem: bzoj 1041 [HAOI2008]圆上的整点    User: fengyuan    Language: C++    Result: Accepted    Time: 276 ms    Memory: 1300 kb    Submit_Time: 2017-12-14 19:52:42*************************************************************/#include<bits/stdc++.h>#define rep(i, x, y) for (int i = (x); i <= (y); i ++)#define down(i, x, y) for (int i = (x); i >= (y); i --)#define mid ((l+r)/2)#define lc (o<<1)#define rc (o<<1|1)#define pb push_back#define mp make_pair#define PII pair<int, int>#define F first#define S second#define B begin()#define E end()using namespace std;typedef long long LL;//headLL r;inline LL gcd(LL a, LL b){ return !b ? a : gcd(b, a%b); }int main(){    scanf("%lld", &r); LL ans = 0;    rep(i, 1, floor(sqrt(2*r))) if (2*r % i == 0){        LL d = i;        rep(j, 1, floor(sqrt(2*r/d))){            LL a = j;            LL b = sqrt(2*r/d-a*a);            if (a*a + b*b != 2*r/d || gcd(a, b) != 1 || b <= a) continue;            ans ++;        }        if (d*d == 2*r || d == 1) continue;        d = 2*r/d;        rep(j, 1, floor(sqrt(2*r/d))){            LL a = j;            LL b = sqrt(2*r/d-a*a);            if (a*a + b*b != 2*r/d || gcd(a, b) != 1 || b <= a) continue;            ans ++;        }    }    printf("%lld\n", ans*4+4);    return 0;}
原创粉丝点击