P2508 [HAOI2008]圆上的整点
题意:
求一个给定的同 (left(x^{2}+y^{2}=r^{2} ight),) 在圆周上有多少个点的坐标是整数。
设正整数(n=2^{a_0}p_{1}^{a_1}dots p_{s}^{a_s}q_{1}^{b_1}dots q_{t}^{b_t}),其中(p_1,dots ,p_s,q_1,dots ,q_t)是不同的质数,(p_iequiv 1pmod{4}(1leq i leq s)),(q_jequiv 3pmod{4}(1leq j leq t)),而(a_0,dots ,a_s,b_1,dots ,b_t)是非负整数,则当(b_1,dots ,b_t)至少有一个为奇数时,(f(n)=0)。而当(b_1,dots ,b_t)都是偶数时,(f(n)=4(a_1+1)(a_2+1)dots (a_s+1)),函数(f(n))表示方程(x^2+y^2=n)的整数解个数。(非负整数解个数是f(n)/4)
上述定理中 (f(n)) 函数表示方程 (x^{2}+y^{2}=n) 的正整数解个数.于是我们可以运用此定理 ,将题目中的 (r) 分解质因数 ,由于是 (x^{2}+y^{2}=r^{2},) 所以 (b_{1} ldots b_{t}) 肯定都为偶数,直接将r的因数乘2后带入上述式子即可。
#include <bits/stdc++.h>
using namespace std;
map<int,int>cnt;
void get(int n){
int temp=n;
int srt=sqrt(n);
int num=0;
for(int i=2;i<=srt+1;i++){
while(temp%i==0){
temp/=i;
cnt[i]++;
}
}
if(temp>1){
cnt[temp]++;
}
}
int main () {
int r;
scanf("%d",&r);
get(r);
int ans=4;
for(auto x:cnt){
int p=x.first,a=x.second;
a*=2;
if(p%4==1){
ans=ans*(a+1);
}
}
printf("%d
",ans);
}