题意

求

\[\sum_{i = 1}^{n} \sum_{i = 1}^{n} f(\gcd(i, j))^k \pmod {2^{32}}
\]

其中 \(f(x)\) 为 \(x\) 的次大质因子,重复的质因子计算多次。

特别的,定义 \(f(1) = 0, f(p) = 0\) ,此处 \(p\) 为质数。

题解

首先先莫比乌斯反演前几步。

\[ans = \sum_{d = 1}^{n} f(d)^k \sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor} \mu(x) (\lfloor \frac{n}{dx} \rfloor)^2
\]

令 \(T = dx\) 那么就化为

\[= \sum_{T = 1}^{n} (\lfloor \frac{n}{T} \rfloor)^2 \sum_{d | T} f(d)^k \mu(\frac{T}{d})
\]

令 \(f(d)^k = F(d)\) 那么就变成

\[= \sum_{T = 1}^{n} (\lfloor \frac{n}{T} \rfloor)^2 (F * \mu)(T)
\]

那么我们整除分块后,只需要快速求 \((F * \mu)\) 的前缀和即可,令 \(\displaystyle S(n) = \sum_{i = 1}^n (F * \mu)(i)\) 。

我们知道 \(\mu * 1 = \epsilon\) ,由于狄里克雷卷积满足结合律,就有 \(F * \mu * 1 = F\) 。

所以我们套上杜教筛的式子,就可以得到

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

杜教筛好像不好算 \(\displaystyle \sum_{i = 1}^n F(i)\) ,其实这是道 原题 。

min25 筛合数的部分 十分契合次大质因子的过程。

每次我们枚举了最小质因子的值,下一次递归计算 \(S(n, i)\) 的时候,那么在 \(P_i \sim P_{|P|}\) 的所有质数上次枚举过来的次大质因子一定都是 \(P_{i - 1}\) 。

那么直接在此处加上贡献即可,不要忘记 \(p^e\) 的贡献要加上去。

复杂度???如果考虑预处理前 \(n^{2 / 3}\) 的答案,并且对于合数部分记忆化的话,应该比较正确。。。

但似乎直接实现虽然有点慢,但也能过???

代码

#include <bits/stdc++.h>

#define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i)
#define Set(a, v) memset(a, v, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define debug(x) cout << #x << ": " << (x) << endl using namespace std; using ll = long long;
using ui = unsigned int; template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; } inline ui read() {
ui x(0), sgn(1); char ch(getchar());
for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * sgn;
} void File() {
#ifdef zjp_shadow
freopen ("572.in", "r", stdin);
freopen ("572.out", "w", stdout);
#endif
} const int N = 1e5 + 1e3; int prime[N], pcnt; bitset<N> is_prime; ui Pow[N], k; ui fpm(ui x, ui power) {
ui res = 1;
for (; power; power >>= 1, x *= x)
if (power & 1) res *= x;
return res;
} void Linear_Sieve(int maxn) {
is_prime.set();
For (i, 2, maxn) {
if (is_prime[i])
prime[++ pcnt] = i, Pow[pcnt] = fpm(i, k);
for (int j = 1; j <= pcnt && 1ll * i * prime[j] <= maxn; ++ j) {
is_prime[i * prime[j]] = false; if (!(i % prime[j])) break;
}
}
} int id1[N], id2[N]; ui val[N * 2], ptot[N * 2], d, all; #define id(x) (x <= d ? id1[x] : id2[all / (x)]) void Min25_Sieve(ui n) {
int cnt = 0;
for (ui i = 1; i <= n; i = n / (n / i) + 1)
val[id(n / i) = ++ cnt] = n / i, ptot[cnt] = val[cnt] - 1; for (int i = 1; i <= pcnt && 1ll * prime[i] * prime[i] <= n; ++ i)
for (int j = 1; j <= cnt && 1ll * prime[i] * prime[i] <= val[j]; ++ j)
ptot[j] -= ptot[id(val[j] / prime[i])] - (i - 1);
} ui S(ui n, int cur) {
if (n <= 1 || (ui)prime[cur] > n) return 0;
ui res = (ptot[id(n)] - (cur - 1)) * Pow[cur - 1];
for (int i = cur; i <= pcnt && 1ll * prime[i] * prime[i] <= n; ++ i) {
ui prod = prime[i];
for (int e = 1; 1ll * prod * prime[i] <= n; ++ e, prod *= prime[i])
res += S(n / prod, i + 1) + Pow[i];
}
return res;
} bitset<N * 2> vis; ui M[N * 2]; ui Calc(ui n) {
if (vis[id(n)]) return M[id(n)];
ui res = S(n, 1) + ptot[id(n)];
for (ui i = 2, ni; i <= n; i = ni + 1)
ni = n / (n / i), res -= (ni - i + 1) * Calc(n / i);
return vis[id(n)] = true, M[id(n)] = res;
} int main () { File(); ui n = read(); k = read(); Linear_Sieve(d = sqrt(n + .5)); all = n; Min25_Sieve(n); ui ans = 0, Last = 0;
for (ui i = 1, ni; i <= n; i = ni + 1) {
ni = n / (n / i); ui res = Calc(ni);
ans += (n / i) * (n / i) * (res - Last); Last = res;
}
printf ("%u\n", ans); return 0; }

LOJ# 572. 「LibreOJ Round #11」Misaka Network 与求和(min25筛,杜教筛,莫比乌斯反演)的更多相关文章

  1. LOJ 572 「LibreOJ Round #11」Misaka Network 与求和——min_25筛

    题目:https://loj.ac/problem/572 莫比乌斯反演得 \( ans=\sum\limits_{D=1}^{n}\left\lfloor\frac{n}{D}\right\rflo ...

  2. Loj#572. 「LibreOJ Round #11」Misaka Network 与求和

    题目 有生之年我竟然能\(A\) 这个题求的是这个 \[\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))^k\] \(f(i)\)定义为\(i\)的次大质因子,其中\(f(p)= ...

  3. LOJ572. 「LibreOJ Round #11」Misaka Network 与求和 [莫比乌斯反演,杜教筛,min_25筛]

    传送门 思路 (以下令\(F(n)=f(n)^k\)) 首先肯定要莫比乌斯反演,那么可以推出: \[ ans=\sum_{T=1}^n \lfloor\frac n T\rfloor^2\sum_{d ...

  4. [LOJ#530]「LibreOJ β Round #5」最小倍数

    [LOJ#530]「LibreOJ β Round #5」最小倍数 试题描述 第二天,LCR 终于启动了备份存储器,准备上传数据时,却没有找到熟悉的文件资源,取而代之的是而屏幕上显示的一段话: 您的文 ...

  5. [LOJ#516]「LibreOJ β Round #2」DP 一般看规律

    [LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...

  6. [LOJ#531]「LibreOJ β Round #5」游戏

    [LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...

  7. [LOJ#515]「LibreOJ β Round #2」贪心只能过样例

    [LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...

  8. [LOJ#525]「LibreOJ β Round #4」多项式

    [LOJ#525]「LibreOJ β Round #4」多项式 试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) ...

  9. [LOJ#526]「LibreOJ β Round #4」子集

    [LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...

随机推荐

  1. [2018福大至诚软工助教]alpha阶段小结

    [2018福大至诚软工助教]alpha阶段小结 一.得分 1. 冲刺(7次 Scrum) 150分 1)第1篇(25分) 项目 评分标准 各个成员在 Alpha 阶段认领的任务 (6分)视详细程度给分 ...

  2. JoinPoint

    “JoinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoint对象. ” JoinPoint适用于注解和Sc ...

  3. 帮助小白,最新版JDK的安装与环境变量配置(Win 10系统)

    学习JAVA,必须首先安装一下JDK(java development kit java开发工具包),之后再配置环境变量就可以开始使用JAVA了. 一,安装JDK 1,可以选择到官网下载最新版本的JD ...

  4. Spring是如何校验XML的

    首先来看下xml的一些概念: xml的schema里有namespace,可以给它起个别名.比如常见的spring的namespace: xmlns:mvc="http://www.spri ...

  5. web项目中的监听器,过滤器以及自定义servlet的执行顺序

    可以看到web容器一启动就会实例化监听器的contextInitialized(ServletContextEvent event)方法,然后是过滤器的init()方法,最后在用户访问web应用的 时 ...

  6. java学习之—栈匹配字符串符号

    /** * 栈 * Create by Administrator * 2018/6/11 0011 * 上午 10:20 **/ public class StackR { private int ...

  7. python设计模式第五天【单例模式】

    1. 定义 一个类只有一个实例,提供访问该实例的全局方法 2.应用场景 (1)多线程之间共享对象资源 (2)整个程序空间中的全局变量,共享资源 (3)大规模程序的节省创建对象的时间 3.代码实现(使用 ...

  8. Delphi窗体之间互相调用的简单问题

    问题是这样的,我的程序主窗口Form1上面有一个数据连接(ADOCONNECTION1)和ADOQUERY,然后还有一些数据感知组件用于浏览用的,我打算点击From1中的一个“修改数据”按钮,就弹出F ...

  9. 如何强制关闭LODOP或c-lodop已经弹出的预览窗口

    该文介绍一下LODOP和C-LODOP关于窗口的弹出,和如何强制关闭已经打开的预览窗口. 同一个页面,只能弹出一个窗口,lodop是禁止点击动作,而c-lodop会提示已有窗口开的,请关闭之类的默认提 ...

  10. .NET提供了三种后台输出js的方式:

    .NET提供了三种后台输出js的方式: 首先创建 js文件testjs.js {    Page.ClientScript.RegisterClientScriptInclude("keys ...