题目描述

给出一个n,求1-n这n个数,同n的最小公倍数的和。

例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66。

由于结果很大,输出Mod 1000000007的结果。

输入

第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 50000)
第2 - T + 1行:T个数A[i](A[i] <= 10^9)

输出

共T行,输出对应的最小公倍数之和

输入样例

3
5
6
9

输出样例

55
66
279

题解

\[ \begin{aligned} &n\sum{\frac{i}{(i,n)}}\\ &=n\sum_{d|n}{\sum_{i=1}^n{\frac{i}{d}}}[(i,n)=d]\\ &=n\sum_{d|n}\sum_{i=1}^{\frac{n}{d}}i[(i,\frac{n}{d})=1]\\ &=n\sum_{d|n}φ(\frac{n}{d})\frac{n}{2d}\\ &=\frac{n}{2}\left(\sum_{d|n}φ(d)d+1\right)\\ \end{aligned} \]

考虑\(\sum_{d|n}φ(d)d\)是个积性函数。

证明:
\[ \begin{aligned} &设x,y互质\\ &\sum_{d|n}φ(d)d=1*(φ·id)\\ &1*(φ(x)·x\timesφ(y)·y)=1*(φ(xy)·xy) \end{aligned} \]

则对于每个p,都有
\[ \sum_{d|p}φ(d)d=1+(p-1)*p=p^2-p+1 \]
p的x次方也类似。根据唯一分解定理,我们可以得到下面的推论:
\[ \begin{aligned} &设f(n)=\sum_{d|n}φ(d)d\\ &f(n)=f(p_1^{c_1})*f(p_2^{c_2})*...*f(p_k^{c_k}) \end{aligned} \]
我们知道\(φ\)函数的一个性质:对于\(n=p^k\),有\(φ(p^k)=p^k-p^{k-1}\)。所以可以预处理质数,然后来分解质因数,对每个质因子算出\(f(p_i^{c_i})\),然后乘起来就好了。(这样复杂度是\(O(\frac{\sqrt{n}}{\log n})\)的,如果不先预处理质数就是\(O(\sqrt{n})\)的,会TLE)

这样子的话常数也是很小的,在51nod跑到了第一页(rk17)。

个人感觉这个做法好写好想啊...为什么网上都没这个做法的题解...都是好麻烦的考虑贡献

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define il inlinenamespace io {#define in(a) a = read()
#define out(a) write(a)
#define outn(a) out(a), putchar('\n')#define I_int ll
inline I_int read() {I_int x = 0, f = 1;char c = getchar();while (c < '0' || c > '9') {if (c == '-') f = -1;c = getchar();}while (c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}return x * f;
}
char F[200];
inline void write(I_int x) {if (x == 0) return (void) (putchar('0'));I_int tmp = x > 0 ? x : -x;if (x < 0) putchar('-');int cnt = 0;while (tmp > 0) {F[cnt++] = tmp % 10 + '0';tmp /= 10;}while (cnt > 0) putchar(F[--cnt]);
}
#undef I_int}
using namespace io;using namespace std;const ll mod = 1e9 + 7;#define N 1000010
int T = read();
int p[N], cnt;
bool vis[N];void init(int n) {cnt = 0;for(int i = 2; i <= n; ++i) {if(!vis[i]) p[++cnt] = i;for(int j = 1; j <= cnt && i * p[j] <= n; ++j) {vis[i * p[j]] = 1;if(i % p[j] == 0) break;}}
}ll power(ll a, ll b) {ll ans = 1;while(b) {if(b & 1) ans = ans * a % mod;a = a * a % mod; b >>= 1;} return ans;
}
ll inv2 = power(2, mod-2);ll solve(ll n) {ll ans = 1;for(int i = 1; p[i] * p[i] <= n && i <= cnt; ++i) {if(n % p[i] == 0) {ll now = 1, sum = 1;while(n % p[i] == 0) {n /= p[i];now *= (ll)p[i];sum += (ll)(now - now / p[i]) * now;}ans = ans * sum % mod;}}if(n > 1) {ans = ans * (1 + n * (n - 1) % mod) % mod;}return ans + 1ll;
}int main() {init(35000);while(T--) {ll n = read();outn(solve(n)*(n*inv2%mod)%mod);}
}

转载于:https://www.cnblogs.com/henry-1202/p/10673353.html

51nod1363 最小公倍数之和相关推荐

  1. C语言易错题--求最大公约数与最小公倍数之和(辗转相除法)

    题目来源:牛客网编程入门训练--BC115  小乐乐与欧几里得 输入描述: 每组输入包含两个正整数n和m.(1 ≤ n ≤ 109,1 ≤ m ≤ 109) 输出描述: 对于每组输入,输出一个正整数, ...

  2. 1190 最小公倍数之和 V2

    1190 最小公倍数之和 V2 ∑i=ablcm(i,b)∑i=abi×bgcd⁡(i,b)b∑d∣b∑i=⌈ad⌉bdi[gcd(i,bd)=1]b∑d∣b∑k∣bdμ(k)k∑i=⌈⌈ad⌉k⌉a ...

  3. P3911 最小公倍数之和 (atcoder C - LCMs)(反演)

    P3911 最小公倍数之和 推式子 ∑i=1n∑j=1nlcm(ai,aj)下面的n=max(ai),ci为i在原数组中出现的次数∑i=1n∑j=1nijgcd(ij)cicj=∑d=1n1d∑i=1 ...

  4. 51 NOD 1363 最小公倍数之和 (欧拉函数思维应用)

    1363 最小公倍数之和 推式子 ∑i=1nlcm(i,n)=n∑i=1nigcd(i,n)=n∑d∣n∑i=1nid(gcd(i,n)==d)=n∑d∣n∑i=1ndi(gcd(i,nd)==1)= ...

  5. [51 nod 1238] 最小公倍数之和 V3(杜教筛)

    1238 最小公倍数之和 V3 推式子 ∑i=1n∑j=1nlcm(i,j)=∑i=1n∑j=1nijgcd(i,j)=∑d=1n∑i=1n∑j=1nijd(gcd(i,j)==d)=∑d=1nd∑i ...

  6. P3911 最小公倍数之和

    最小公倍数之和 题目描述: 对于A1,A2-AN,求 ∑i=1N∑i=1Nlcm(Ai,Aj)\sum_{i=1}^{N}\sum_{i=1}^{N} lcm(Ai,Aj)∑i=1N​∑i=1N​lc ...

  7. 51 NOD 1238 最小公倍数之和 V3

    原题链接 最近被51NOD的数论题各种刷--(NOI快到了我在干什么啊! 然后发现这题在网上找不到题解--那么既然A了就来骗一波访问量吧-- (然而并不怎么会用什么公式编辑器,写得丑也凑合着看吧-- ...

  8. [51nod1238] 最小公倍数之和 V3(杜教筛)

    题面 传送门 题解 懒了--这里写得挺好的-- //minamoto #include<bits/stdc++.h> #define R register #define ll long ...

  9. 51nod1238 最小公倍数之和 V3

    又被这神仙题给坑爆了. 神仙题解. 一开始我把lcm变成ij/gcd然后按照常规套路去推,推到最后发现不是miu * Id而是miu · Id......这还搞鬼啊. 正解居然跟这个差不多,先转成求其 ...

最新文章

  1. 有关弹窗页面的注意问题
  2. 入侵无需密码? 雅虎数据泄露调查新进展
  3. redis internal【转】
  4. 温州大学《机器学习》课程课件(八、集成学习)
  5. 【高清】网络安全思维导图
  6. matlab 大括号
  7. 如何通过图片识别用的什么字体?
  8. 树状数组相关应用之多叉树子树问题
  9. 《软件工程》课堂作业:返回一个整数数组中最大字数组的和
  10. Java反射库jOOR简介
  11. OpenCV-图像处理(14、基本阈值操作)
  12. miniprogrampatch 提供 watch 和 computed 特性
  13. 飞机飞行原理之空气流动基本规律
  14. android蓝牙取sbc音频数据
  15. Java开发人员能力模型
  16. 网易免费企业邮箱服务器地址
  17. mysql 5.7 group replication 之五 [ERROR] Plugin group_replication reported: 'Table tmp_t0 does not hav
  18. html 前端优化上传视频,前端上传组件Plupload使用---上传大视频(分片上传)
  19. 第三代CAN技术即将到来
  20. 校园网络的未来发展方向

热门文章

  1. 一阶电路误差分析_电动涡旋压缩机转子的模态分析及试验研究
  2. python3发布时间_什么时候python 3 才能有更好的支持呢?
  3. 计算机专业学生前端该怎么自学?
  4. 【干货】写给初中级前端的高级进阶指南
  5. java中bash应用_在bash脚本中查找java应用程序的进程ID(以查看目标应用程序是否已在运行)...
  6. STM8学习笔记---PWM互补波形输出
  7. Nginx——配置动静分离
  8. POJ-1062-昂贵的聘礼 (最短路)
  9. Android学习笔记(一)——控件布局常用属性
  10. 习题3.9 堆栈操作合法性 (20分)