博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[2018.12.16]BZOJ1041 [HAOI2008]圆上的整点
阅读量:6701 次
发布时间:2019-06-25

本文共 962 字,大约阅读时间需要 3 分钟。

首先要看懂

然后这题已经做完了。

要求半径为\(r\)的圆上的整点数量,就是求半径为\(\sqrt{r^2}\)的圆上的整点数量。

\(r=\prod_{i=1}^n p_i^{k_i}(p_i\in Prime)\)

\(r^2=\prod_{i=1}^n p_i^{2k_i}(p_i\in Prime)\)

根据视频内容,我们知道当\(p_i=4n+1(n\in \mathbb{N^+})\)时,答案会乘上\(2k_i+1\);否则不会产生任何贡献(由于\(2k_i\)是偶数,所以即使\(4n+3\)型素数也不会影响答案)。

\(n\)分解质因数即可。

时间复杂度\(O(\sqrt{n})\)

code:

#include
using namespace std;int n,m,p[100010],sz,tot,ans=1;int main(){ freopen("1041.in","r",stdin); freopen("1041.out","w",stdout); scanf("%lld",&n); m=sqrt(n); for(int i=2;i<=m;i++){//小于等于sqrt(n)的线性筛 if(!p[i])p[++sz]=i; for(int j=1;j<=sz;j++){ if(p[j]*i>m)break; p[p[j]*i]=1; if(i%p[j]==0)break; } } for(int i=1,tot=0;i<=sz;tot=0,i++){ while(n%p[i]==0)tot++,n/=p[i]; if((p[i]-1)%4==0)ans*=2*tot+1; } if(n!=1&&(n-1)%4==0)ans*=3;//大于sqrt(n)的质因子最多只有一个 printf("%d",4*ans); return 0;}

转载于:https://www.cnblogs.com/xryjr233/p/BZOJ1041.html

你可能感兴趣的文章
正则则表达式大全(收集)
查看>>
手把手教你完成第一个vivado项目
查看>>
webpack-Module Resolution(模块解析)
查看>>
linux日志logger命令详解
查看>>
SQL SERVER 如果判断text类型数据不为空
查看>>
mongodb安全权限设定
查看>>
glib 散列表
查看>>
javascript模拟C# Stringbuilder
查看>>
解析Linux系统关于用户权限、组
查看>>
Android 如何判断一个应用在运行
查看>>
分组背包题目
查看>>
获取GridView TemplateField的数据
查看>>
Ecshop的lbi库文件中嵌套调用另一个lbi库文件
查看>>
Spring XmlBeanFactory例子[转]
查看>>
delphi AfterScrol
查看>>
用c#读取并分析sql2005日志
查看>>
两味中药治疗肛痔
查看>>
口唇口腔紅肿案
查看>>
ZeroMQ接口函数之 :zmq_ctx_get - 得到环境上下文的属性
查看>>
JSP基本用法(二)隐含对象
查看>>