P2508 [HAOI2008]圓上的整點

題目描述

求一個給定的圓(x^2+y^2=r^2),在圓周上有多少個點的座標是整數。ios

輸入輸出格式

輸入格式:數組

 

ride

 

輸出格式:spa

 

整點個數code

 

輸入輸出樣例

輸入樣例#1:  複製
4
輸出樣例#1:  複製
4

說明

n<=2000 000 000視頻

 

 

/*
    處理篩法: 
    篩素數篩到r<=2e9的話顯然數組開不下 
    顯然一個數有<=1個大於它的sqrt的素因子 
    因此咱們篩小於等於sqrt(r)的範圍內的素數 
    而後用篩出來的素數將n質因數分解後可能r!=1
    這個時候的n就是n的那個大於sqrt(r)的素因子 

    處理計算: 
    若是prime[i]%4==3的話,prime[i]就是個素數,同時也是個高斯素數,對答案無影響 
    若是prime[i]%4==1,就記錄prime[i]的指數tmp,讓ans*=(tmp*2+1)
    至於爲何這麼作,本身看視頻去。
    https://www.bilibili.com/video/av12131743/
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int N=4e4+5;

bool flag[N];
int prime[N],cnt;
inline void init()
{
    for(int i=2;i<N;++i)
    {
        if(!flag[i])
            prime[++cnt]=i;
        for(int j=1,k;j<=cnt&&(k=prime[j]*i)<N;++j)
        {
            flag[k]=1;
            if(i%prime[j]==0)
                break;
        }
    }
}

int n;
int main()
{
    init();
    scanf("%d",&n);
    while((n&1)^1)
        n>>=1;
    int ans=1;
    for(int i=1,tmp=0;i<=cnt&&n!=1;++i)
    {
        if(n%prime[i])
            continue;
        tmp=0;
        while(n%prime[i]==0)
            ++tmp,n/=prime[i];
        if(prime[i]%4==1)
            ans*=(tmp<<1|1);
    }
    if(n>1&&n%4==1)
        ans*=3;
    cout<<(ans<<2);
    return 0;
}
/*
    處理篩法: 
    篩素數篩到r<=2e9的話顯然數組開不下 
    顯然一個數有<=1個大於它的sqrt的素因子 
    因此咱們篩小於等於sqrt(r)的範圍內的素數 
    而後用篩出來的素數將n質因數分解後可能r!=1
    這個時候的n就是n的那個大於sqrt(r)的素因子 

    處理計算: 
    若是prime[i]%4==3的話,prime[i]就是個素數,同時也是個高斯素數,對答案無影響 
    若是prime[i]%4==1,就記錄prime[i]的指數tmp,讓ans*=(tmp*2+1)
    至於爲何這麼作,本身看視頻去。
    https://www.bilibili.com/video/av12131743/
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int N=4e4+5;

bool flag[N];
int prime[N],cnt;
inline void init()
{
    for(int i=2;i<N;++i)
    {
        if(!flag[i])
            prime[++cnt]=i;
        for(int j=1,k;j<=cnt&&(k=prime[j]*i)<N;++j)
        {
            flag[k]=1;
            if(i%prime[j]==0)
                break;
        }
    }
}

int n;
int main()
{
    init();
    scanf("%d",&n);
    while((n&1)^1)
        n>>=1;
    int ans=1;
    for(int i=1,tmp=0;i<=cnt&&n!=1;++i)
    {
        if(n%prime[i])
            continue;
        tmp=0;
        while(n%prime[i]==0)
            ++tmp,n/=prime[i];
        if(prime[i]%4==1)
            ans*=(tmp<<1|1);
    }
    if(n>1&&n%4==1)
        ans*=3;
    cout<<(ans<<2);
    return 0;
}
相關文章
相關標籤/搜索