bzoj1041-[HAOI2008]圆上的整点

根本不会做,看了某国外大神数论详解豁然贯通,还知道了pi=4*(1-1/3+1/5-1/7...)是怎么推的。

链接:https://www.bilibili.com/video/av12131743/

简单来说就是将二维平面看成是复数集合,那么一个圆上的整点(a,bi)必然满足(a,bi)*(a,-bi)=r*r(这样一对复数也称共轭复数,蒟蒻理解就是关于x轴对称一对点...),而共轭复数是可以分解出来的,一个质数如果模4余1可以分解为一对,模4余3不能分解(什么费马平方和定理),2毫无软用。然后这题就变为n*n分解质因数,将分出来的质数根据情况判断

#include<bits/stdc++.h>
#define iter map<int,int>::iterator
#define ll long long
using namespace std;
map<int,int>vis;
int main()
{
	int n;ll ans=4;
	cin>>n;
	for(int i=2;i*i<=n;i++)
		while(n%i==0)vis[i]+=2,n/=i;
	if(n!=1)vis[n]+=2;
	for(iter i=vis.begin();i!=vis.end();i++)
	{
		if(i->first==2)continue;
		else if(i->first%4==3)
			ans*=(i->second%2==0)?1:0;
		else if(i->first%4==1)
			ans*=(i->second+1);
	}
	cout<<ans;
}

猜你喜欢

转载自blog.csdn.net/caoyang1123/article/details/81434665