题解 P2508 【[HAOI2008]圆上的整点】
首先我依然要推一下这个视频:
当初看不懂这个视频,现在依然看不大懂……但还是懂一点了……
我这里就只说说结论了……
(按视频的内容,我们要把
[FBI WARNING] 下方及其混乱 纯属个人理解 并不严谨
前置芝士(瞎讲)
首先我们知道,一个平面直角坐标系是看成全体复数的集合的,
举个栗子,比如
其次,我们知道,一个整点如果在圆上,要满足的是
我们将
重要的来了,此时我们会发现,有一些素数,它们的平方可以被因式分解成一个复数和这个复数的复共轭的乘积,如
事实上素数可以分为三种:
解题方法
对于这题,我们先将
然后答案就等于:
解释一下为什么,如果一个质因数对答案有贡献,首先它得是
于是这道题的解法就呼之欲出了,当然,为了节省空间,防止
(非常混乱 凑合着看吧 感觉
见代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int r,n,pri[100005],tot;
ll ans=1;
bool isp[500005];
int main()
{
scanf("%d",&r);
n=sqrt(r);
for(int i=2;i<=n;i++)
{
if(!isp[i]) pri[++tot]=i;
for(int j=1;j<=tot && i*pri[j]<=n;j++)
{
isp[i*pri[j]]=1;
if(!(i%pri[j])) break;
}
}
for(int i=1;i<=tot;i++)
{
int sum=0;
while(!(r%pri[i]))
{
sum++;
r/=pri[i];
}
if(pri[i]%4==1) ans*=sum*2+1;
}
if(r>1 && r%4==1) ans*=3;
printf("%lld\n",ans*4);
return 0;
}