【BZOJ2226】LCM SUM,数论之一维LCM(莫比乌斯反演)
2016-06-18 11:01
429 查看
Time:2016.06.18
Author:xiaoyimi
转载注明出处谢谢
传送门
思路:
一开始的我只能推出一个O(n√⋅n√=n)的式子(两次分块),但是O(Tn)的复杂度对于这道题并不科学……
后来发现求n以内与n互质的数的和可以O(1)求o_O
神奇的反演……
∑ni=1lcm(i,n)
=∑ni=1nigcd(i,n)
=∑ni=1∑nd=1ni[gcd(i,n)=d]d
=∑ni=1∑nd=1[d|i][d|n]ni[gcd(id,nd)=1]d
=∑nd=1∑ndi=1[d|n][gcd(i,nd)=1]i⋅n
=∑nd=1[d|n]n⋅f(nd)
其中f(n)
=∑ni=1[gcd(i,n)=1]i
=∑ni=1i∑nd=1[d|i][d|n]μ(d)
=∑nd=1[d|n]μ(d)⋅d∑ndi=1i
=∑nd=1[d|n]μ(d)⋅d⋅(nd+1)⋅nd/2
=∑nd=1[d|n]μ(d)⋅n⋅(nd+1)/2
通过φ=μ×id,e=μ×1
=n2(φ(n)+e(n))
代码:
Author:xiaoyimi
转载注明出处谢谢
传送门
思路:
一开始的我只能推出一个O(n√⋅n√=n)的式子(两次分块),但是O(Tn)的复杂度对于这道题并不科学……
后来发现求n以内与n互质的数的和可以O(1)求o_O
神奇的反演……
∑ni=1lcm(i,n)
=∑ni=1nigcd(i,n)
=∑ni=1∑nd=1ni[gcd(i,n)=d]d
=∑ni=1∑nd=1[d|i][d|n]ni[gcd(id,nd)=1]d
=∑nd=1∑ndi=1[d|n][gcd(i,nd)=1]i⋅n
=∑nd=1[d|n]n⋅f(nd)
其中f(n)
=∑ni=1[gcd(i,n)=1]i
=∑ni=1i∑nd=1[d|i][d|n]μ(d)
=∑nd=1[d|n]μ(d)⋅d∑ndi=1i
=∑nd=1[d|n]μ(d)⋅d⋅(nd+1)⋅nd/2
=∑nd=1[d|n]μ(d)⋅n⋅(nd+1)/2
通过φ=μ×id,e=μ×1
=n2(φ(n)+e(n))
代码:
#include<cstdio> #include<iostream> #define M 1000004 #define LL long long using namespace std; int n,T; int prime[M>>2],phi[M]; bool vis[M]; LL ans; int in() { int t=0;char ch=getchar(); while (ch>'9'||ch<'0') ch=getchar(); while (ch>='0'&&ch<='9') t=(t<<3)+(t<<1)+ch-48,ch=getchar(); return t; } LL cal(int n){return (LL)n*(phi +(n==1))/2;} main() { for (int i=2;i<=M-4;i++) { if (!vis[i]) prime[++prime[0]]=i, phi[i]=i-1; for (int j=1;j<=prime[0];j++) if (i*prime[j]>M-4) break; else { vis[i*prime[j]]=1; phi[i*prime[j]]=phi[i]*(prime[j]-(i%prime[j]!=0)); if (i%prime[j]==0) break; } } phi[1]=1; for (T=in();T;T--) { n=in(); ans=0; for (int d=1;d*d<=n;d++) if (n%d==0) { ans+=cal(n/d); if (d*d<n) ans+=cal(d); } printf("%lld\n",ans*n); } }
相关文章推荐
- 1074. Reversing Linked List (25)
- shell脚本
- iOS 绘制虚线
- UITableViewcell 样式的自定义
- dev XtraMessageBox按钮显示中文
- [POJ1050]To the Max(最大子矩阵,DP)
- 包含min函数的栈
- 代理模式
- android中Invalidate和postInvalidate的区别
- C#中Dynamic关键字
- LeetCode-350 Intersection of Two Arrays II
- C++简单多线程事件驱动同步通知到主线程
- 字符编码笔记:ASCII,Unicode和UTF-8
- 函数与类
- Android day8
- 数据结构与算法:二叉树
- MS Chart Control - X轴 项目超9项时 Label显示不完全(已解决)
- 使用quartyz2D画圆,并将其三等分
- (OK)(OK)(All in CLI) Fedora23 + Docker(busybox) + NS3 + MANETs - testing
- 172. Factorial Trailing Zeroes