2705: [SDOI2012]Longge的问题
2016-02-29 11:35
399 查看
Submit: 1898 Solved: 1191
[Submit][Status][Discuss]
Description
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。Input
一个整数,为N。Output
一个整数,为所求的答案。Sample Input
6Sample Output
15HINT
【数据范围】
对于60%的数据,0<N<=2^16。
对于100%的数据,0<N<=2^32。
题解:
题目中要求出∑gcd(i,N)(1<=i<=N)。枚举n的约数k,令s(k)为满足gcd(m,n)=k,(1<=m<=n)m的个数,则ans=sigma(k*s(k)) (k为n的约数)因为gcd(m,n)=k,所以gcd(m/k,n/k)=1,于是s(k)=phi(n/k),注意,这里的phi(n/k)是指小于等于n/k与n/k互质的数的个数,phi可以在根号的时间内求出。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #include<cstring> #include<queue> #include<vector> using namespace std; typedef long long LL; LL N,sqr,ANS; inline LL phi(LL n){ LL m=(LL)sqrt(n+0.5); LL ans=n; for(LL i=2;i<=m;i++){ if(n%i==0){ ans=(ans*(i-1))/i; while(n%i==0) n/=i; } } if(n>1) ans=(ans*(n-1))/n; return ans; } int main(){ scanf("%lld",&N); sqr=LL(sqrt(N+0.5)); for(LL i=1;i<=sqr;i++){ if(N%i==0){ ANS+=phi(N/i)*i; if(i*i<N) ANS+=(N/i)*phi(i); } } printf("%lld",ANS); return 0; }
相关文章推荐
- 生成.a
- muduo库的学习11---TcpServer与TcpClient的基本设计---TcpConnection接收与发送
- 瀑布模型开发与敏捷开发的对比
- 《JAVA编程思想》日志(四)------控制执行流程
- 反射实现对象改值
- HDFS如何检测并删除多余副本块
- win7 扩展双屏后 双屏同时显示任务栏
- [转] 小议同步IO :fsync与fdatasync
- 17、胡适谈哲学与人生
- js面向对象基础
- UITableView使用详解
- First Missing Positive
- 二月英语 再度起飞
- httpclien各个版本超时时间设置
- muduo库的学习10---TcpServer与TcpClient的基本设计---TcpConnection建立与关闭
- 【转】ConcurrentModificationException异常解决办法 --不错
- [案例]更高效,更安全,北京高法开启“掌上法院”新时代
- [Locked] Unique Word Abbreviation
- 简单的苗为课堂搜索版式编写《超链接》
- CentOS 6.5系统上安装SVN服务器端的方法及目录访问权限配置(转总结)