[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,心里肯定已经有不下一万种解法了。

  小C先口胡两句,你们意会就好。

    题目要我们求的是以原点为圆心,半径为的圆经过了多少个整点。

    所以我们只要把的所有因数的函数值相加的和乘上4就是答案。

  请完全无视上面两行!完全无视!现在说正经的:

  根据我们的知识储备,我们知道,对于圆

  将a进行质因数分解,得

  如果存在i使得为奇数,那么该圆不经过任何整点。

  否则答案就是

  根据上面的结论,由于题目中的a是完全平方数,所以不存在di为奇数的情况,因此必定经过整点。

  所以我们只要把r质因数分解,挑出其中形如4k+1的质数,该质数的指数为d,对答案的贡献就是乘上2*d+1。

  时间复杂度是质因数分解的

#include <cstdio>
#include <algorithm>
#include <cstring>
#define MN 60005
using namespace std;
int n,ans,pin,pri[MN];
bool u[MN];

inline int read()
{
    int n=0,f=1; char c=getchar();
    while (c<‘0‘ || c>‘9‘) {if(c==‘-‘)f=-1; c=getchar();}
    while (c>=‘0‘ && c<=‘9‘) {n=n*10+c-‘0‘; c=getchar();}
    return n*f;
}

int main()
{
    register int i,j,lt;
    n=read(); ans=1;
    for (i=2;1LL*i*i<=n;++i)
    {
        if (!u[i]) pri[++pin]=i;
        for (j=1;1LL*i*i*pri[j]*pri[j]<=n;++j)
        {
            u[i*pri[j]]=true;
            if (i%pri[j]==0) break;
        }
    }
    while (n%pri[1]==0) n/=pri[1];
    for (i=2;i<=pin;++i)
    {
        for (lt=0;n%pri[i]==0;++lt) n/=pri[i];
        if (pri[i]%4==1) ans*=lt<<1|1;
    }
    if (n!=1&&n%4==1) ans*=3;
    printf("%d",ans<<2);
}

Last Word

  我在B站学数学.jpg

  开什么玩笑!B站本来就是优秀的在线学习网站!(小C口胡不下去了)

时间: 2024-10-06 02:45:16

[BZOJ]1045 圆上的整点(HAOI2008)的相关文章

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,显然过不了全点. 然后

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是否和题意即可

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=根号

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 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一定互