【欧拉函数】BZOJ2705: [SDOI2012]Longge的问题
Description
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
Solution
如果我们考虑每个gcd的贡献
那么k作为约数的贡献就是k*phi(n/k)
于是只需要枚举约数计算phi就行了
然而这好像是暴力=v=
然而约数也不可能很多
这么打也非常快
另:从这里也可以推出Σ[d|n]φ(d)=n
考虑phi函数计算
感觉可以考虑pi的贡献
然而我并是理不太清于是弃疗了
官方题解的确是这样:http://www.cnblogs.com/JS-Shining/archive/2012/05/14/2500661.html
各种专有名词云云感觉真要是遇到了也就只能凭感觉蒙一蒙了
Code
枚举约数的技巧是只枚举到sqrt(n),大约数可由小约数得到
一般phi计算sqrt(n),搞出素数表可以更快
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #define ll long long 5 using namespace std; 6 7 ll n,ans; 8 9 ll phi(ll x){ 10 ll ret=x; 11 for(ll i=2;i*i<=x;i++) 12 if(x%i==0){ 13 ret=(ret/i*(i-1)); 14 while(x%i==0) x/=i; 15 } 16 if(x>1) ret=ret/x*(x-1); 17 return ret; 18 } 19 20 int main(){ 21 scanf("%lld",&n); 22 for(ll i=1;i*i<=n;i++) 23 if(n%i==0){ 24 ans+=i*phi(n/i); 25 if(i*i<n) ans+=(n/i)*phi(i); 26 } 27 printf("%lld\n",ans); 28 return 0; 29 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· Java轻量级代码工程
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战