嘟嘟嘟




这题跟上一道题有点像,但是我还是没推出来……菜啊

\[\begin{align*}
ans
&= \sum_{i = 1} ^ {n} \frac{i * n}{gcd(i, n)} \\
&= n * \sum_{d | n} \sum_{i = 1} ^ {n} [gcd(i, n) = d] * \frac{i}{d} \\
&= n * \sum_{d | n} \sum_{i = 1} ^ {\frac{n}{d}} [gcd(i, n) = 1] * i \\
\end{align*}\]

令\(f(n)\)表示小于等于\(n\)且与\(n\)互质的数的和,则

\[\begin{align*}
ans
&= n * \sum_{d | n} f(\frac{n}{d}) \\
&= n * \sum_{d | n} f(d)
\end{align*}\]

如果\(i\)与\(n\)互质,那么\(n - i\)一定也和\(n\)互质,所以\(\varphi(n)\)个数两两配对等于\(n\),得到\(f(n) = \frac{\varphi(n) * n}{2}\)。

但是这对\(1\)不成立,因此要特别处理\(f(1) = 1\),于是

\[ans = n * (\sum_{d | n, d > 1} \frac{\varphi(d) * d}{2} + 1)
\]

这个时候可以每一次\(O(\sqrt{n})\)枚举\(n\)的约数,总复杂度\(O(n + T *\sqrt{n} )\),但是还可以再优化:我们像埃氏筛素数一样,\(O(n \log{n})\)预处理\(f(i)\)。然后\(O(1)\)询问。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<cstdlib>
  7. #include<cctype>
  8. #include<vector>
  9. #include<stack>
  10. #include<queue>
  11. using namespace std;
  12. #define enter puts("")
  13. #define space putchar(' ')
  14. #define Mem(a, x) memset(a, x, sizeof(a))
  15. #define rg register
  16. typedef long long ll;
  17. typedef double db;
  18. const int INF = 0x3f3f3f3f;
  19. const db eps = 1e-8;
  20. const int maxn = 1e6 + 5;
  21. inline ll read()
  22. {
  23. ll ans = 0;
  24. char ch = getchar(), last = ' ';
  25. while(!isdigit(ch)) last = ch, ch = getchar();
  26. while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
  27. if(last == '-') ans = -ans;
  28. return ans;
  29. }
  30. inline void write(ll x)
  31. {
  32. if(x < 0) x = -x, putchar('-');
  33. if(x >= 10) write(x / 10);
  34. putchar(x % 10 + '0');
  35. }
  36. int n;
  37. int prim[maxn], v[maxn], phi[maxn];
  38. ll ans[maxn];
  39. void init()
  40. {
  41. phi[1] = 1;
  42. for(int i = 2; i < maxn; ++i)
  43. {
  44. if(!v[i]) v[i] = i, phi[i] = i - 1, prim[++prim[0]] = i;
  45. for(int j = 1; j <= prim[0] && i * prim[j] < maxn; ++j)
  46. {
  47. v[i * prim[j]] = prim[j];
  48. if(i % prim[j] == 0)
  49. {
  50. phi[i * prim[j]] = phi[i] * prim[j];
  51. break;
  52. }
  53. else phi[i * prim[j]] = phi[i] * (prim[j] - 1);
  54. }
  55. }
  56. for(int i = 1; i < maxn; ++i)
  57. for(int j = 1; i * j < maxn; ++j)
  58. ans[i * j] += (ll)phi[i] * i;
  59. for(int i = 1; i < maxn; ++i) ans[i] = (ans[i] + 1) * i >> 1;
  60. }
  61. int main()
  62. {
  63. init();
  64. int T = read();
  65. while(T--) n = read(), write(ans[n]), enter;
  66. return 0;
  67. }

luogu P1891 疯狂LCM的更多相关文章

  1. P1891 疯狂LCM

    \(\color{#0066ff}{ 题目描述 }\) 众所周知,czmppppp是数学大神犇.一天,他给众蒟蒻们出了一道数论题,蒟蒻们都惊呆了... 给定正整数N,求LCM(1,N)+LCM(2,N ...

  2. 洛谷 - P1891 - 疯狂LCM - 线性筛

    另一道数据范围不一样的题:https://www.cnblogs.com/Yinku/p/10987912.html $F(n)=\sum\limits_{i=1}^{n} lcm(i,n) $ $\ ...

  3. 题解:洛谷P1891 疯狂LCM

    原题链接 题目描述 描述: 众所周知,czmppppp是数学大神犇.一天,他给众蒟蒻们出了一道数论题,蒟蒻们都惊呆了... 给定正整数N,求LCM(1,N)+LCM(2,N)+...+LCM(N,N) ...

  4. 洛谷 P1891 疯狂LCM 题解

    原题链接 享受推式子的乐趣吧 数论真有趣! 庆祝:数论紫题第 \(3\) 道. \[\sum_{i=1}^n \operatorname{lcm}(i,n) \] \[= \sum_{i=1}^n \ ...

  5. 洛咕 【P1891】疯狂LCM & 三倍经验

    经验给掉先: 经验*1 经验*2 经验*3 这里给个跑得比较慢的 \(n \sqrt n\) 预处理然后 \(O(1)\) 回答询问的做法 式子 首先我们推柿子: \[\begin{aligned}A ...

  6. luogu1891 疯狂lcm ??欧拉反演?

    link 给定正整数N,求LCM(1,N)+LCM(2,N)+...+LCM(N,N). 多组询问,1≤T≤300000,1≤N≤1000000 \(\sum_{i=1}^nlcm(i,n)\) \( ...

  7. luogu P1616 疯狂的采药

    题目背景 此题为NOIP2005普及组第三题的疯狂版. 此题为纪念LiYuxiang而生. 题目描述 LiYuxiang是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的 ...

  8. [Luogu1891]疯狂LCM[辗转相减法]

    题意 多组询问,每次给定 \(n\) ,求:\(\sum_{i=1}^nlcm(i,n)\) . \(\rm T \leq 3\times 10^4\ ,n \leq 10^6\). 分析 推式子: ...

  9. 疯狂LCM

    传送门 题目要求求: \[\sum_{i=1}^nlcm(i,n)\] 先转化成gcd处理: \[n\sum_{i=1}^n\frac{i}{gcd(i,j)}\] 之后老套路 枚举gcd,并且先把d ...

随机推荐

  1. JS 格林威治时间格式(GMT)格式化

    Date.prototype.format = function (format) { var o = { "M+": this.getMonth() + 1, //month & ...

  2. jQuery自定义数组操作类(类似于List集合的增删改查)

    js外部文件,前提需要引入jquery类库. 封装类代码如下: (function ($) {     $.List = function () {         var _list = new A ...

  3. leaks工具查找内存泄露

    作为一名iOS开发攻城狮,在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我 ...

  4. 使用JDBC一次执行多条语句(以MySQL为例)

    阅读本文需要的先修知识: 最基本的SQL语句 最基本的JDBC操作(如插入单条记录) 如急需使用请直接看最后一段代码. 在JDBC中,对记录进行修改操作最简单的方法是使用executeUpdate() ...

  5. Mybatis标签bind用法

    Mybatis使用bind元素进行模糊查询,不用在乎数据库是mysql还是oracle从而提高可移植性 使用bind元素传递多个参数 public List<Student> findSt ...

  6. CPU单核多核区别【转载】

    CPU个数.CPU核心数.CPU线程数 我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级.CPU从早期的单核,发展到现在的双核,多核.CPU除了核心数之外,还有线程数之 ...

  7. python学习之老男孩python全栈第九期_day007作业

    一.关系运算 有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合pythons={'alex','egon','yuanhao','wu ...

  8. js-ES6学习笔记-for...of循环

    1.一个数据结构只要部署了Symbol.iterator属性,就被视为具有iterator接口,就可以用for...of循环遍历它的成员.也就是说,for...of循环内部调用的是数据结构的Symbo ...

  9. MyEclipse中搭建Struts2开发环境

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/53205941 冷血之心的博客) 在MyEclipse中如何搭建St ...

  10. Linux  释放Linux 系统预留的硬盘空间

    释放 Linux 系统预留的硬盘空间 by:授客 QQ:1033553122   大多数文件系统都会保留一部分空间作为紧急情况时用(比如硬盘空间满了),这样能保证有些关键应用(比如数据库)在硬盘满的时 ...