[bzoj]2705: [SDOI2012]Longge的问题[数论][数学][欧拉函数][gcd]
2024-09-05 20:30:00
Longge的问题
Description
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
Input
一个整数,为N。
Output
一个整数,为所求的答案。
Sample Input
6
Sample Output
15
HINT
【数据范围】
对于60%的数据,0<N<=2^16。
对于100%的数据,0<N<=2^32。
注意到这些最大公约数肯定是n的约数,对于约数K,我们想找出gcd(n,i)=k的有多少个,也即gcd(n/k,i/k)=1,也就等价于求φ(n/k)。
ans=Σφ(n/k)*k
问题就在于怎么求φ(n),之前竟然一直不知道可以sqrt(n)计算,感觉自己好傻,今天学习了...(一直以为要用递推,不然就要写线性筛[神经病啊])
还有就是枚举sqrt(n)时注意k*k=n的情况,没判这种情况结果bzoj过了,luogu没过...很尴尬。
代码:
//2017.10.31 //math #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll ; inline ll read(); namespace lys{ ll n,ans; ll phi(ll x){ int i; ll w=x,res=x; ;1LL*i*i<=w;i++){ if(!(x%i)){ res=res*(i-)/i; while(!(x%i)) x/=i; } } ) res=res*(x-)/x; return res ; } int main(){ int i; n=read(); ;1LL*i*i<=n;i++) if(!(n%i)){ ans+=phi(n/i)*i; if(1LL*i*i!=n) ans+=phi(i)*(n/i); } printf("%lld\n",ans); ; } } int main(){ lys::main(); ; } inline ll read(){ ll kk=,ff=; char c=getchar(); '){ ; c=getchar(); } +c-',c=getchar(); return kk*ff; }
最新文章
- codeforces Codeforces Round #380 (Div. 1, Rated, Based on Technocup 2017 - Elimination Round 2)// 二分的题目硬生生想出来ON的算法
- 老学员的学习感悟 --prince2认证有什么用
- php部分---一个分页类、用法
- 为图片添加九宫格信息-UI界面编辑器(SkinStudio)教程
- UIView的ContentMode
- SqlSever基础 datepart函数 返回现在几点了
- 简单实现web单点登录
- C# Access DBHelp
- FFMPEG + SDL音频播放分析
- Qt知识点、疑难杂症的治疗
- java虚拟机学习-JVM调优总结-基本垃圾回收算法(7)
- 算法:javascript截取字符串
- Spring+EhCache缓存实例(详细讲解+源码下载)
- DeepLearning.ai学习笔记(四)卷积神经网络 -- week4 特殊应用:人力脸识别和神经风格转换
- nginx学习笔记(三)
- Java使用RabbitMQ之公平分发
- oracle表被锁(delete或update一直处于执行状态)的处理办法。
- C++ cout
- OASGraph 转换rest api graphql 试用
- java基本语法一