BZOJ 1041: [HAOI2008]圆上的整点【高斯素数】

1041: [HAOI2008]圆上的整点

Time Limit: 10 Sec Memory Limit: 162 MB

Description

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

Input

只有一个正整数n,n<=2000 000 000

Output

整点个数

Sample Input

4

Sample Output

4

HINT

科普视频

题解

我的想法和黄学长的想法不同,我没看懂他的想法QAQ。
我的想法比较神奇,因为看了这个视频,十分完美的解决了此题:https://www.bilibili.com/video/av12131743/,讨论里也有,就是科普视频的完整版(我也不知道BZOJ里为什么只能看5分钟)。
视频有点长,但是我还是建议看一下,十分有帮助。
我继续视频中讲到的知识,解决这道题。
显然是要将nn拆成素数的积,但是题目给的是半径r=r2r=r2
所以我们要求r2r2的素数积。
那么怎么求呢?
r=pa11pa22pa33...pakkr=p1a1∗p2a2∗p3a3∗...∗pkak
r2=(pa11pa22pa33...pakk)2=p2a11p2a22p2a33...p2akkr2=(p1a1∗p2a2∗p3a3∗...∗pkak)2=p12a1∗p22a2∗p32a3∗...∗pk2ak
所以只需要求r的质因子然后2∗2就可以了。
然后我们要求

X(n)=1(nmod4==1)1(nmod4==3)0(nmod2==0)X(n)={1(nmod4==1)−1(nmod4==3)0(nmod2==0)

对于 r2r2,没有任何质因子只出现奇数次的情况,所以只需要判 nmod4==1nmod4==1的情况,直接 (ai+1)∗(ai+1)就可以了。
当然,我们求r,所以只需要筛到 rr就可以了,但是有情况是r本身是一个大素数,或是一个大素数*小素数,所以晒完之后再特判一下就可以了。

代码如下

#include<cmath>
#include<cstdio>
#define LL long long
using namespace std;
LL n,m,Ans=1,p[500005];
bool vis[500005];
void make_p(){
    int Len=500000;
    vis[0]=vis[1]=1;
    for(int i=2;i<=Len;i++){    
        if(!vis[i]) p[++p[0]]=i;
        for(int j=1;j<=p[0]&&i*p[j]<=Len;j++){
            vis[i*p[j]]=1;
            if(!(i%p[j])) break;
        }
    }
}
int main(){
    #ifndef ONLINE_JUDGE
    freopen("prob.in","r",stdin);
    freopen("prob.out","w",stdout);
    #endif
    make_p();
    scanf("%lld",&n);
    while(!(n&1)) n/=2;
    for(int i=1;i<=p[0]&&p[i]<=n;i++)
    if(!(n%p[i])){
        LL Num=0;
        while(!(n%p[i])) Num++,n/=p[i];
        Num<<=1;
        if(p[i]%4==1) Ans*=Num+1;
    }
    if(n>1) if(n%4==1) Ans*=3;
    printf("%lld\n",Ans*4);
    return 0;
}

转载于:https://www.cnblogs.com/XSamsara/p/9030294.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值