BZOJ 1041 [HAOI2008]圆上的整点:数学【费马平方和定理】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041
题意:
给定n(n <= 2*10^9),问你在圆x^2 + y^2 = n^2的圆周上,有多少个坐标为整数的点。
题解:
科普视频:http://www.bilibili.com/video/av12131743/
推导的大致思路:
推导:
一、17 = 4^2 + 1^2
求圆周上有多少个点,就是求有多少个整数对(a,b)满足a^2 + b^2 = R^2。
二、17 = (4+i)*(4-i)
变形:a^2 + b^2 = (a + b*i) * (a - b*i) = R^2。
其中,a + b*i 与 a - b*i 复共轭。
也就是将R^2分解成(a + b*i) * (a - b*i)。
有一个结论,对于整数a来说:
(1)如果a为4n + 1型的素数,则a可以被分解为两个不同的高斯素数。
(2)如果a为4n + 3型的素数,则不能被分解。因为它们不仅是普通素数,还是高斯素数。
(即费马平方和定理:只有4n+1型的素数,才能表示成两个数的平方和)
分解方法:
(1)首先将R^2分解质因数,R^2 = a1^p1 + a2^p2 +...
(2)然后将R^2继续分解成若干高斯素数之积。
(3)将这些高斯素数分成两组,如果这两组各自之积复共轭,则为一对合法的(a,b)。
其中,将高斯素数分组时,对于一个素因子ai,有pi+1中分组方法。
特别地,2^k对于最终答案没有影响。
根据乘法原理,在能够分组(分成复共轭数)的前提下,最终的分组方法数 = 4*∏(pi+1)。
(这就是本题的做法。分解质因数,复杂度O(sqrt(N)))
三、积性函数χ(n),求π的表达式(这部分跟此题无关)
对于函数χ(n),定义为:
(1)n = 4k + 1时,χ(n) = 1
(2)n = 4k + 3时,χ(n) = -1
(3)n为偶数时,χ(n) = 0
函数χ(n)对于任意整数满足性质:χ(ab) = χ(a)*χ(b),所以χ(n)为积性函数。
将圆上点的数量写成如下形式:
即:N = 4*∏(∑ χ(ki)),ki为R^2的因子。
将上式拆开,每一项χ(n)的n为R的因子:
圆内所有点的个数:
移动之后:
所以得到了圆内点的个数,也就是圆面积的另一种表达形式。
最终得到了一个π的表达式。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; long long n;
long long ans=; int main()
{
cin>>n;
n=n*n;
long long t=n;
while(!(t&)) t>>=;
for(int i=;i*i<=n && t>;i++)
{
int p=;
while(t%i==)
{
p++;
t/=i;
}
if(i%==) ans*=(p+);
else if(i%== && (p&))
{
ans=;
break;
}
}
if(t%==) ans=;
cout<<ans*<<endl;
}
BZOJ 1041 [HAOI2008]圆上的整点:数学【费马平方和定理】的更多相关文章
- bzoj 1041: [HAOI2008]圆上的整点 数学
1041: [HAOI2008]圆上的整点 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- BZOJ 1041: [HAOI2008]圆上的整点【数论,解方程】
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4210 Solved: 1908[Submit][Sta ...
- BZOJ 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3621 Solved: 1605[Submit][Sta ...
- bzoj 1041: [HAOI2008]圆上的整点 本原勾股數組
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2027 Solved: 853[Submit][Stat ...
- BZOJ 1041 [HAOI2008]圆上的整点:数学
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 题意: 给定n(n <= 2*10^9),问你在圆x^2 + y^2 = n^ ...
- BZOJ(2) 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4966 Solved: 2258[Submit][Sta ...
- 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4298 Solved: 1944[Submit][Sta ...
- 【BZOJ】1041: [HAOI2008]圆上的整点(几何)
http://www.lydsy.com:808/JudgeOnline/problem.php?id=1041 所谓的神题,我不会,直接题解..看了半天看懂题解了.详见hzwer博客 这题呢,我只能 ...
- 1041: [HAOI2008]圆上的整点 - BZOJ
Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数.Input rOutput 整点个数Sample Input4Sample Output4HINT n ...
随机推荐
- Android 基于Retrofit+Rxjava搭建的简单易用的网络架构
装逼開始之前,为大家推荐两篇文章,用来更好的学习Retrofit和Rxjava. 在这里我们要感谢互联网装逼行业勇于献身,甘于奉献的的大婶们. 我仅代表个人,给您们跪舔了. Retrofit:Retr ...
- BZOJ 4128 Matrix BSGS+矩阵求逆
题意:链接 方法: BSGS+矩阵求逆 解析: 这题就是把Ax=B(mod C)的A和B换成了矩阵. 然而别的地方并没有修改. 所以就涉及到矩阵的逆元这个问题. 矩阵的逆元怎么求呢? 先在原矩阵后接一 ...
- UNP学习笔记(第四章 基本TCP套接字编程)
本章讲解编写一个完整的TCP客户/服务器程序所需要的基本套接字函数. socket函数 #include <sys/socket.h> int socket(int family,int ...
- Matlab 绘图全方位分析及源码
Matlab绘图 强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数.此外,M ...
- [ACM] hdu 1029 Ignatius and the Princess IV (动归或hash)
Ignatius and the Princess IV Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32767K (Ja ...
- 完好用户体验: 活用window.location与window.open解决页面跳转问题
原文地址: JavaScript Redirects and window.open原文日期: 2014年08月27日翻译日期: 2014年08月31日翻译人员: 铁锚 (译者注: 本文解决的是按 C ...
- 【selenium+Python unittest】之发送带中文附件的邮箱
完整原码如下: import smtplib from email.mime.text import MIMEText #from email.header import Header from em ...
- PowerBuilder -- 调试(Debug)
@.进入代码调试,执行下一步直接就退出了调试 原文:http://bbs.csdn.net/topics/390126005 处理方法:尝试把 Watch 中查看的变量全部删掉.
- JavaWeb学习总结第一篇--初识JavaWeb
JavaWeb学习总结(一)-- 初识JavaWeb 一:Web相关概念 Web程序也就是一般所说的网站,由服务器.客户端浏览器和网络组成.Web程序的好处就是使用简单,不需要安装.学习,有一台电脑. ...
- java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
spring3_hibernate 集成报错信息 java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljav ...