4 条题解
-
2
其实就是 Gaussian 整数的经典题目。
用 Gaussian 整数可以简洁优雅地描述这类问题:圆上整点计数问题。
关于 Gaussian 整数的基本知识可以看我的学习笔记。
求 上的整点 数目。
即求范数为 的 Gaussian 整数 个数。
考虑先在 上运用唯一分解定理。
$$C=2^{a_2}\left(\prod_{p\text{ 为 }4n+3\text{ 型素数}}p^{a_p}\right)\left(\prod_{p\text{ 为 }4n+1\text{ 型素数}}p^{a_p}\right) $$不妨先考虑一种解法,然后再取四个相伴。
对每个素因子我们分别考虑其分解为 后 对 的贡献。显然答案互不干涉。
因子显然对答案无影响。
型素数因子若有 ,则此题无解;否则无影响。
型素数因子有 种分配答案的方法。
因此,再考虑上可逆元的贡献 ,答案即为
$$4\left(\prod_{p\text{ 为 }4n+3\text{ 型素数}}[2|a_p]\right)\left(\prod_{p\text{ 为 }4n+1\text{ 型素数}}a_p+1\right) $$
关于本题的实现。
由于 ,直接对 质因数分解即可对 质因数分解。
然后我们显然可以在 内找到 的质因数分解式。
于是就解完了。
以下是核心代码。
int main() { ullt r,ans=4;scanf("%llu",&r),r/=lowbit(r); for(ullt i=3;i*i<=r;i++)if(!(r%i)) { uint cnt=1;do r/=i,cnt+=2;while(!(r%i)); if(!(i&2))ans*=cnt; } if(r>1&&!(r&2))ans*=3; printf("%llu\n",ans); return 0; }
-
1
令
有:
由于 ,因此 。
而 是一个完全平方数,因此 也是一个完全平方数。
令
有:
$$\begin{cases} r-x=d \times s^2 \\ r+x=d \times t^2 \end{cases} $$解得:
$$\begin{cases} x=\dfrac{t^2-s^2}{2}\times d \\ r=\dfrac{s^2+t^2}{2} \times d \end{cases} $$我们可以枚举 ,再枚举 ,要保证 。
求出 后可以将 解出,这里我们发现四个象限内的点数是一样的,因此这里以第一象限为例。
我们求出 后判断
最后结果为 (坐标轴上有一个点,同时有四个象限)。
#include<bits/stdc++.h> using namespace std; typedef long long LL; LL r,ans=0; void solve(LL d){ for(LL s=1;s*s<=r/d;s++){ LL t=sqrt(r/d-s*s);//这里的r/d-s*s不一定是完全平方数,要判一下 if(__gcd(s,t)==1&&s*s+t*t==r/d){ LL x=(t*t-s*s)/2*d,y=d*s*t; if(x>0&&y>0&&x*x+y*y==(r/2)*(r/2)){//不能写r*r/4,会爆longlong ans+=2; } } } } int main(){ scanf("%lld",&r); r=r*2; for(LL d=1;d*d<=r;d++){ if(r%d==0){ solve(d); if(d*d!=r)solve(r/d); } } printf("%lld",(ans+1)*4); return 0; }
-
1
高斯整数版本的。
#include<bits/stdc++.h> using namespace std; typedef long long LL; const LL N=1e6+5; LL p[N],c[N],cnt; LL qpow(LL a,LL b){ LL ans=1; while(b){ if(b&1)ans=ans*a; a=a*a;b>>=1; } return ans; } int main(){ LL r,ans=0;scanf("%lld",&r); for(LL i=2;i*i<=r;i++){ if(r%i==0){ cnt++; p[cnt]=i; while(r%i==0){ c[cnt]++; r/=i; } } } if(r>1){ cnt++; p[cnt]=r; c[cnt]++; } ans=4; for(LL i=1;i<=cnt;i++){ LL sum=0; for(LL j=0;j<=2*c[i];j++){ LL res=qpow(p[i],j); if(res%4==1)sum++; else if(res%4==3)sum--; } ans=ans*sum; } printf("%lld",ans); return 0; }
- 1
信息
- ID
- 1041
- 时间
- 1000ms
- 内存
- 162MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 60
- 已通过
- 27
- 上传者