「Luogu P2508」[HAOI2008]圆上的整点 解题报告

题面

给定圆的半径,求圆上整点数

这是一道很Nice的数学题!超爱!好吧,由于这道题,我去Study了一下复数(complex number)复杂的数

真棒!!!

有兴趣的戳这里!!!\(\huge \to\)

思路:

高斯素数的原理,将整数分解质因数后,再把每个质因数分解成高斯素数,对于质数4n+1,它可以有效的分解成高斯素数,而质数4n+3不能,因为3无法分解为高斯素数,所以当一个数有奇数个3因子时,这个圆上没有整点,而3的个数为偶数时,由于能分成两组配对,所以有整点,但3对Ans的影响为0,因为x*1=x,因此只要不变就行了,当由于2的高斯素数表示为1-i*1+i,所以2的个数对Ans无影响

对于25如下:

\[ \large 25=5 \times 5 \]

\[ \large 25=(2-i)(2+i)(2-i)(2+i) \]

所以:

LeftRight
\(\large 1\)\(\large 1\)
\(\large 2-i\)\(\large 2+i\)
\(\large 2-i\)\(\large 2+i\)
\(\large =3-4i\)\(\large =3+4i\)

这是一种情况\(\large (3,-4)\)

LeftRight
\(\large 2-i\)\(\large 2-i\)
\(\large 2+i\)\(\large 2+i\)
\(\large =5\)\(\large =5\)

这是一种情况\(\large (5,0)\)

LeftRight
\(\large 2+i\)\(\large 2+i\)
\(\large 2+i\)\(\large 2+i\)
\(\large =3+4i\)\(\large =3-4i\)

这是一种情况\(\large (3,-4)\)

而对于上述

\(\large \times\)\(\large 3-4i\)\(\large 5\)\(\large 3+4i\)
\(\large -1\)\(\large -1+4i\)\(-5\)\(\large -3-4i\)
\(\large i\)\(\large 4+3i\)\(\large 5i\)\(\large -4+3i\)
\(\large -i\)\(\large -4-3i\)\(\large -5i\)\(\large 4-3i\)

所以一共有点对12

那么高斯素数怎么表示点呢?

它只要一个数,就可以表示点的坐标,RT:

o_K%5BB_22PQSQJ%5BL0LBICFQDMD.png

Code:

#include<bits/stdc++.h>
#define N 10000010
#define ll long long
using namespace std;
ll n,m,res,ans=4;
ll a[N],t,T;
ll p[N];
ll s[N];
bool b[N];
int main()
{
    ll i,j;
    scanf("%lld",&n);
    m=n;
    for(i=2;i*i<=m;i++)
    {
        if(!b[i])
        {
            a[++T]=i;
            if(m%i==0)
            {
                p[++t]=i;
                while(m%i==0)
                {
                    m/=i;
                    s[t]++;
                }
            }
        }
        for(j=1;j<=T;j++)
        {
            if(a[j]*i*i*a[j]>m)
                continue;
            b[a[j]*i]=1;
            if(i%a[j]==0)
                continue;
        }
    }
    if(m>1)
    {
        p[++t]=m;
        s[t]=1;
    }
    for(i=1;i<=t;i++)
        if((p[i]-1)%4==0)
            ans*=(2*s[i]+1);
    printf("%lld",ans);
    return 0;
}

转载于:https://www.cnblogs.com/hovny/p/10195211.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值