求一個給定的圓(x^2+y^2=r^2),在圓周上有多少個點的座標是整數。ios
輸入格式:數組
ride
輸出格式:spa
整點個數code
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; }