题目链接

简单的数学题

题目描述

输入一个整数n和一个整数p,你需要求出

\[\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p
\]

其中\(gcd(a,b)\)表示\(a\)与\(b\)的最大公约数

输入

一行两个整数\(p,n\)

输出

一行一个整数,为题目中所求值

样例

样例输入

  1. 998244353 2000

样例输出

  1. 883968974

数据范围

\(n\leq 10^{10}\)

\(5\times 10^8 \leq p \leq 1.1\times 10^9​\)

\(p​\)为质数(但貌似也可以不是?又不用求逆元)

题解

自己想出来的题!但是连\(WA\)两发就是因为杜教筛写挂了……

先不考虑取余,我们化一下题目中的式子,枚举\(gcd\)(警告!多公式)。

\[\sum_{i=1}^n\sum_{j=1}^n i\cdot j\cdot gcd(i,j)
\]

\[\sum_{d=1}^{n}d\sum_{i=1}^{\left\lfloor \frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor \frac{n}{d}\right\rfloor}[i\perp j]i\cdot j \cdot d^2
\]

\[\sum_{d=1}^{n}d^3\sum_{i=1}^{\left \lfloor \frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor \frac{n}{d}\right\rfloor}[i\perp j]i\cdot j
\]

\[\sum_{d=1}^{n}d^3\sum_{p=1}^{\left \lfloor \frac{n}{d}\right\rfloor}\mu(p)p^2\cdot \Big(\frac{(1+\left\lfloor \frac{n}{dp}\right\rfloor)\left\lfloor \frac{n}{dp}\right\rfloor}{2}\Big)^2
\]

额,现在可以使用分块优化做到\(O(n)​\)了,但是这完全不能胜任数据范围,我们换个角度,设\(dp=T​\),枚举\(T\)会有什么结果?

\[\sum_{T=1}^{n}\Big(\frac{(1+\left\lfloor \frac{n}{T}\right\rfloor)\left\lfloor \frac{n}{T}\right\rfloor}{2}\Big)^2\sum_{d|T}d^3\cdot \mu(\frac{T}{d})(\frac{T}{d})^2
\]

\[\sum_{T=1}^{n}\Big(\frac{(1+\left\lfloor \frac{n}{T}\right\rfloor)\left\lfloor \frac{n}{T}\right\rfloor}{2}\Big)^2 T^2\sum_{d|T}d\cdot \mu(\frac{T}{d})
\]

现在好像反而变成\(O(n\log n)\)或\(O(n\sqrt{n})\)了,别急,我们看看第二层的求和的意义——狄利克雷卷积,这是\(Id\)函数与\(\mu\)函数的狄利克雷卷积,其值就等于\(\varphi\)。

\[\sum_{T=1}^{n}\Big(\frac{(1+\left\lfloor \frac{n}{T}\right\rfloor)\left\lfloor \frac{n}{T}\right\rfloor}{2}\Big)^2 T^2\varphi(T)
\]

现在,我们只需要快速求出一个东西即可——\(T^2\varphi(T)\),前面的部分可以分块优化,我们急需解决的就是这个函数\(f(T)=T^2\varphi(T)\)的前缀和\(F(T)\)。显然,这是一个积性函数。

杜教筛的公式:

\[\sum_{i=1}^{n}(f*g)(i)=\sum_{i=1}^{n}\sum_{d|i}f(d)\cdot g(\frac{i}{d})=\sum_{i=1}^{n}g(i)\sum_{j=1}^{\left\lfloor \frac{n}{i}\right\rfloor}f(j)
\]

于是我们需要一个函数与\(f\)卷起来,我们根据套路或枚举发现\(T^2\)项很恼人,于是尝试把这一项消掉,于是想到了\(g(x)=x^2\)。

\[\sum_{i=1}^{n}\sum_{d|i}d^2\varphi(d)\cdot (\frac{i}{d})^2=\sum_{i=1}^{n}i^2\sum_{j=1}^{\left\lfloor \frac{n}{i}\right\rfloor}f(j)
\]

\[\sum_{i=1}^{n}i^2\sum_{d|i}\varphi(d)=\sum_{i=1}^{n}i^2F(\left\lfloor \frac{n}{i}\right\rfloor)​
\]

根据公式\(\sum_{d|i}\varphi(d)=i\),继续变形

\[\sum_{i=1}^{n}i^3=F(n)+\sum_{i=2}^{n}i^2F(\left\lfloor \frac{n}{i}\right\rfloor)
\]

\[F(n)=\sum_{i=1}^{n}i^3-\sum_{i=2}^{n}i^2F(\left\lfloor \frac{n}{i}\right\rfloor)
\]

由于\(p(i)=i^3\)和\(q(i)=i^2\)的前缀和都有公式,我们可以对右边进行分块优化,就可以杜教筛了!这道题圆满解决,时间复杂度\(O(n^{\frac{2}{3}})\)。

不过有些小细节要注意,比如模数乘\(2\)可能会爆\(int\),\(n^2\)可能会爆\(long\ long\),需要先取模再平方

\(Code:\)

  1. #include <map>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. #define N 5000005
  8. #define ll long long
  9. map<ll, ll>Phi;
  10. ll n, mod, g[N];
  11. int p[N], h[N], phi[N], cnt;
  12. ll sqr(ll x)
  13. {
  14. ll a = 2 * x + 1, b = x + 1, c = x;
  15. if (b % 2 == 0)b /= 2;
  16. else c /= 2;
  17. if (a % 3 == 0)a /= 3;
  18. else
  19. if (b % 3 == 0)b /= 3;
  20. else c /= 3;
  21. a %= mod, b %= mod, c %= mod;
  22. return a * b % mod * c % mod;
  23. }
  24. ll seq(ll x)
  25. {
  26. ll a = x + 1, b = x;
  27. if (a % 2 == 0)a /= 2;
  28. else b /= 2;
  29. a %= mod, b %= mod;
  30. return a * b % mod;
  31. }
  32. ll vas(ll x)
  33. {
  34. ll a = seq(x);
  35. return a * a % mod;
  36. }
  37. ll G(ll x)
  38. {
  39. if (x <= N - 5)
  40. return g[int(x)];
  41. if (Phi.find(x) != Phi.end())
  42. return Phi[x];
  43. ll ans = vas(x);
  44. ll lst = 1;
  45. for (ll i = 2; i <= x; i++)
  46. {
  47. i = x / (x / i);
  48. ll w = (sqr(i) - sqr(lst)) % mod;
  49. ans = (ans - w * G(x / i) % mod) % mod;
  50. lst = i;
  51. }
  52. if (ans < 0)
  53. ans += mod;
  54. Phi.insert(make_pair(x, ans));
  55. return ans;
  56. }
  57. ll Ans(ll x)
  58. {
  59. ll ans = 0, lst = 0;
  60. for (ll i = 1; i <= x; i++)
  61. {
  62. i = x / (x / i);
  63. ll z = seq(x / i);
  64. z = z * z % mod;
  65. ans = (ans + z * (G(i) - G(lst)) % mod) % mod;
  66. lst = i;
  67. }
  68. if (ans < 0)
  69. ans += mod;
  70. return ans;
  71. }
  72. int main()
  73. {
  74. phi[1] = 1;
  75. for (int i = 2; i <= N - 5; i++)
  76. {
  77. if (!h[i])
  78. {
  79. phi[i] = i - 1;
  80. p[++cnt] = i;
  81. }
  82. for (int j = 1; j <= cnt; j++)
  83. {
  84. if (i * p[j] > N - 5)
  85. break;
  86. h[i * p[j]] = 1;
  87. if (i % p[j] == 0)
  88. phi[i * p[j]] = phi[i] * p[j];
  89. else
  90. phi[i * p[j]] = phi[i] * (p[j] - 1);
  91. }
  92. }
  93. cin >> mod >> n;
  94. for (int i = 1; i <= N - 5; i++)
  95. g[i] = (g[i - 1] + 1ll * phi[i] * i % mod * i % mod) % mod;
  96. cout << Ans(n) << '\n';
  97. }

「洛谷P3768」简单的数学题 莫比乌斯反演+杜教筛的更多相关文章

  1. luogu 3768 简单的数学题 (莫比乌斯反演+杜教筛)

    题目大意:略 洛谷传送门 杜教筛入门题? 以下都是常规套路的变形,不再过多解释 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}ijgcd(i,j)$ $\sum ...

  2. 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛

    题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...

  3. LOJ#6229. 这是一道简单的数学题(莫比乌斯反演+杜教筛)

    题目链接 \(Description\) 求\[\sum_{i=1}^n\sum_{j=1}^i\frac{lcm(i,j)}{gcd(i,j)}\] 答案对\(10^9+7\)取模. \(n< ...

  4. 洛谷P3768 简单的数学题 【莫比乌斯反演 + 杜教筛】

    题目描述 求 \[\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} i*j*gcd(i,j) \pmod{p}\] \(n<=10^{10}\),\(p\) ...

  5. 洛谷 P6860 - 象棋与马(找性质+杜教筛)

    题面传送门 首先我们来探究一下什么样的 \((a,b)\) 满足 \(p(a,b)=1\).不难发现只要点 \((1,0)\) 能够到达,那么网格上所有点都能到达,因为由于 \((1,0)\) 能够到 ...

  6. EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)

    传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...

  7. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  8. 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】

    题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...

  9. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

随机推荐

  1. Git学习笔记(四)标签和搭建Git服务

    一.标签是什么 发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一 ...

  2. 用Nmap检测漏洞

    介绍两个NSE脚本,可以检测CVE漏洞 nmap-vulners:https://github.com/vulnersCom/nmap-vulners vulscan:https://github.c ...

  3. 文件锁简单操作(lockfileEx\unlockfileEx)

    #include "stdafx.h"#include <Windows.h>#include <iostream> using namespace std ...

  4. ajax补充FormData

    一.回顾上节知识点 1.什么是json字符串? 轻量级的数据交换格式 2.定时器:关于setTimeout setTimeout(foo,3000)  # 3000表示3秒,foo表示一个函数,3秒后 ...

  5. jdbcTemplate学习(二)

    前面讲了增加.删除.更新操作,这节讲一下查询. 查询操作: (一)查询一个值(不需要注入参数) queryForObject(String sql, Class<T> requiredTy ...

  6. 问题:oracle 字符串转换成日期;结果:[oracle] to_date() 与 to_char() 日期和字符串转换

    to_date("要转换的字符串","转换的格式")   两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...

  7. LAMP 3.5 mysql备份与恢复

    备份库的命令 mysqldump -uroot -pwangshaojun discuz > /data/discuz.sql 指定用户密码,重定向到某文件 恢复 mysql -uroot -p ...

  8. 北京儿研所自制药一览表,宝妈们必读!<转>

    原帖地址:http://www.360doc.com/content/15/0910/22/22655489_498339090.shtml

  9. 【275】◀▶ Python 控制语句说明

    参考:Python循环语句 01   for 循环语句. 02   while 循环语句. 03   if...else 选择语句. 04   continue 执行循环语句中的下一条循环. 05   ...

  10. interface 接口 和多态的含义

    <?php //interface关键字用于定义接口 interface ICanEat{ //接口里面的方法不需要方法的实现 public function eat($food) ; } // ...