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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值