BZOJ 1041 圆上的整点

Description

求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。

Input

r

Output

整点个数

Sample Input

4

Sample Output

4

HINT

n<=2000 000 000

一下内容转自:http://blog.csdn.net/csyzcyj/article/details/10044629

首先,最暴力的算法显而易见:枚举x轴上的每个点,带入圆的方程,检查是否算出的值是否为整点,这样的枚举量为2*N,显然过不了全点。

然后想数学方法。

有了上面的推理,那么实现的方法为:

枚举d∈[1,sqrt(2R)],然后根据上述推理可知:必先判d是否为2R的一约数。

此时d为2R的约数有两种情况:d=d或d=2R/d。

第一种情况:d=2R/d。枚举a∈[1,sqrt(2R/2d)] <由2*a*a < 2*R/d转变来>,算出对应的b=sqrt(2R/d-a^2),检查是否此时的A,B满足:A≠B且A,B互质 <根据上面的推理可知必需满足此条件>,若是就将答案加1

第二种情况:d=d。枚举a∈[1,sqrt(d/2)] <由2*a*a < d转变来>,算出对应的b=sqrt(d-a^2),检查是否此时的A,B满足:A≠B且A,B互质 <根据上面的推理可知必需满足此条件>,若是就将答案加1

因为这样只算出了第一象限的情况<上面枚举时均是从1开始枚举>,根据圆的对称性,其他象限的整点数与第一象限中的整点数相同,最后,在象限轴上的4个整点未算,加上即可,那么最后答案为ans=4*第一象限整点数+4

【时间复杂度分析】:

枚举d:O(sqrt(2R)),然后两次枚举a:O(sqrt(d/2))+O(sqrt(R/d)),求最大公约数:O(logN)

 1 #include<algorithm>
 2 #include<cmath>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 using namespace std;
 6
 7 #define maxn 300010
 8 long long n;
 9 long long ans,prime[maxn],tot,cnt;
10 bool exist[maxn];
11 pair <long long,long long> use[maxn];
12
13 inline long long gcd(long long a,long long b)
14 {
15     if (b == 0) return a;
16     return gcd(b,a%b);
17 }
18
19 inline void ready()
20 {
21     long long i,j;
22     for (i = 2;i <= 300000;++i)
23     {
24         if (exist[i]) continue;
25         prime[++tot] = i;
26         for (j = i*i;j <= 300000;j += i) exist[i] = true;
27     }
28 }
29
30 inline void divide(long long k)
31 {
32     for (long long i = 1;k != 1 && i <= tot;++i)
33         if (k % prime[i] == 0)
34         {
35             long long t = 0;
36             while (k % prime[i] == 0) k/=prime[i],t++;
37             use[++cnt] = make_pair(prime[i],t);
38         }
39     if (k != 1) use[++cnt] = make_pair(k,1);
40 }
41
42 inline long long calc(long long d)
43 {
44     long long ret = 0; d = n / d;
45     for (long long i = 0;((i*i)<<1) <= d;++i)
46     {
47         long long t = sqrt((double)(d - i*i));
48         if (t * t + i * i != d) continue;
49         if (gcd(t,i) != 1) continue;
50         ret++;
51     }
52     return ret;
53 }
54
55 inline void dfs(long long now,long long mul)
56 {
57     if (now > cnt)
58     {
59         ans += calc(mul);
60         return;
61     }
62     dfs(now+1,mul);
63     long long t1 = use[now].first,t2 = use[now].second;
64     for (long long i = 1;i <= t2;++i) mul *= t1, dfs(now+1,mul);
65 }
66
67 int main()
68 {
69     freopen("1041.in","r",stdin);
70     freopen("1041.out","w",stdout);
71     ready();
72     scanf("%lld",&n); n <<= 1;
73     divide(n);
74     dfs(1,1);
75     (ans *= 4) -= 4;
76     printf("%lld",ans);
77     fclose(stdin); fclose(stdout);
78     return 0;
79 }

时间: 2024-08-02 11:04:27

BZOJ 1041 圆上的整点的相关文章

[BZOJ]1045 圆上的整点(HAOI2008)

数学题第二弹! Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 一个正整数r. Output 整点个数. Sample Input 4 Sample Output 4 HINT r<=2000 000 000 Solution 小C不想写题解啊啊啊啊!!!! 题解在这里啊啊啊啊!!!!(看完记得投币!!!!) 我爱数学啊啊啊啊!!!! 开玩笑的,还是说一说题解吧. 相信如果你认真看完了上面那个视频的前25min,心里肯定已经有不下一

BZOJ 1041: [HAOI2008]圆上的整点【数论,解方程】

1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4210  Solved: 1908[Submit][Status][Discuss] Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Sample Input 4 Sample Output 4 HINT 科普视频 So

BZOJ 1041 [HAOI2008]圆上的整点

1041: [HAOI2008]圆上的整点 Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Sample Input 4 Sample Output 4 鸣谢:http://blog.csdn.net/csyzcyj/article/details/10044629  http://hzwer.com/1457.html 这么一到水题竟然卡了我一晚上,想起来确

bzoj 1041: [HAOI2008]圆上的整点 本原勾股數組

1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2027  Solved: 853[Submit][Status] Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input r Output 整点个数 Sample Input 4 Sample Output 4 HINT n<=2000 000 000 Source 這道題可用本原勾股數組解,由於本原

【BZOJ 1041】 [HAOI2008]圆上的整点

1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2196  Solved: 941 [Submit][Status] Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input r Output 整点个数 Sample Input 4 Sample Output 4 HINT n<=2000 000 000 接下来枚举d,a,判断求出的b是否和题意即可

1041: [HAOI2008]圆上的整点

1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4298  Solved: 1944[Submit][Status][Discuss] Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Sample Input 4 Sample Output 4 HINT 科普视频 /*

bzoj千题计划127:bzoj1041: [HAOI2008]圆上的整点

http://www.lydsy.com/JudgeOnline/problem.php?id=1041 设 X>0 ,Y>0 X^2 + Y^2 = R^2 X^2 = R^2-Y^2 = (R+Y)(R-Y) 令  d=gcd(R+Y,R-Y),A=(R+Y)/d,B=(R-Y)/d 则 gcd(A,B)=1,且A != B X^2= d^2 *A * B 所以 A * B 为 完全平方数 又因为 gcd(A,B)=1 ,A!=B,所以 A,B 都是 完全平方数 令 a= 根号A,b=根号

BZOJ 4544: 椭圆上的整点

Sol 数学. 跟圆上的整点一样...TA写了个积性函数的算法...以后再说吧... \(x^2+3y^2=r^2\) \(3y^2=r^2-x^2\) \(3y^2=(r-x)(r+x)\) \(y^2=\frac{1}{3}(r-x)(r+x)\) \(d=(r-x)(r+x)\) \(r-x=3du^2,r+x=dv^2\) 这里 \(r-x\) 和 \(r+x\) 并没有什么区别. \(2r=d(3u^2+v^2)\) 枚举 \(d\) 和 \(u\) 感觉复杂度是\(O(n^{\fra

BZOJ 1041 HAOI2008 圆上的整点 数论

题目大意:给定一个半径为为r的圆x^2+y^2=r^2,求圆上多少个点的坐标为整数 卡了很久的一道题...我之前用了两个公式,理论上可以O(√n)出解,可惜这两个公式并不能涵盖所有勾股数... 于是去找了下题解,发现这样一种方法:(原帖地址: http://www.cppblog.com/zxb/archive/2010/10/18/130330.html ) x^2+y^2=r^2 化简为 y^2=(r-x)(r+x) 我们令d=gcd(r-x,r+x) 则(r-x)/d与(r+x)/d一定互