设 \(f(i)\) 表示大小为 \(k\),\(\gcd\) 为 \(i\) 的方案数。\(F(i)\) 表示大小为 \(k\),\(\gcd\) 为 \(i\) 的倍数的方案数。

不难看出:\(F(i) = \sum \limits _{i | d} f(d)\)。同时记 \(w_i\) 为数列中 \(i\) 的倍数的个数,则 \(F(i) = \dbinom {w_i} {k}\)。

可以莫反对吧。

\[\begin {align}
f (i) &= \sum _{i | d} F(d) \mu(\frac {d} {i})
\\
\mathrm{Ans} &= \sum _{i = 1} ^{k} i \times f(i) = \sum _{i = 1} ^{k} i \sum _{i | d}\mu (\frac {d} {i}) \times \dbinom {w_d} {k}
\end {align}
\]

有插入操作,不难发现每加入一个数只会让若干个 \(w_x\) 加上 \(1\)。

注意到这部分的贡献,应该为 \(a \times b\),其中 \(a = \dbinom {w_x + 1} {k} - \dbinom {w_x} {k}\),而 \(b = \sum \limits _{i | x} i \times \mu ({\frac {x} {i}})\)。

而 \(b\) 可以看出是 \(\mu\) 和 \(\mathrm{Id}\) 的卷积,也就是 \(\varphi\) ,可以线性筛预处理。

#include <cstdio>

typedef long long LL;
int Abs (int x) { return x < 0 ? -x : x; }
int Max (int x, int y) { return x > y ? x : y; }
int Min (int x, int y) { return x < y ? x : y; } int Read () {
int x = 0, k = 1;
char s = getchar ();
while (s < '0' || s > '9') {
if (s == '-')
k = -1;
s = getchar ();
}
while ('0' <= s && s <= '9')
x = (x << 3) + (x << 1) + (s ^ 48), s = getchar ();
return x * k;
} void Write (int x) {
if (x < 0)
putchar ('-'), x = -x;
if (x > 9)
Write (x / 10);
putchar (x % 10 + '0');
} void Print (int x, char s) { Write (x), putchar (s); } const int Mod = 1e9 + 7;
const int Maxn = 1e6 + 5; bool Flag[Maxn];
int Num[Maxn], Inv[Maxn], Fac[Maxn], Phi[Maxn], Cnt[Maxn], Len = 0; int C (int n, int m) { return n < m ? 0 : (LL)Fac[n] * Inv[n - m] % Mod * Inv[m] % Mod; } void Init () {
Flag[1] = true, Phi[1] = 1;
for (int i = 2; i < Maxn; i++) {
if (!Flag[i])
Num[++Len] = i, Phi[i] = i - 1;
for (int j = 1; j <= Len; j++) {
if (i * Num[j] >= Maxn)
break;
Flag[i * Num[j]] = true;
if (i % Num[j] == 0) {
Phi[i * Num[j]] = Phi[i] * Num[j];
break;
}
Phi[i * Num[j]] = Phi[i] * Phi[Num[j]];
}
}
Inv[1] = 1;
for (int i = 2; i < Maxn; i++)
Inv[i] = (LL)(Mod - Mod / i) * Inv[Mod % i] % Mod;
Fac[0] = 1, Inv[0] = 1;
for (int i = 1; i < Maxn; i++) {
Fac[i] = (LL)Fac[i - 1] * i % Mod;
Inv[i] = (LL)Inv[i - 1] * Inv[i] % Mod;
}
} int main () {
Init ();
int n = Read (), k = Read (), q = Read (), Res = 0;
for (int i = 1, x; i <= n; i++) {
x = Read ();
for (int j = 1; j * j <= x; j++) {
if (x % j)
continue;
Cnt[j]++, Res = (Res + (LL)Phi[j] * (C (Cnt[j], k) - C (Cnt[j] - 1, k) + Mod) % Mod) % Mod;
if (j * j != x)
Cnt[x / j]++, Res = (Res + (LL)Phi[x / j] * (C (Cnt[x / j], k) - C (Cnt[x / j] - 1, k) + Mod) % Mod) % Mod;
}
}
for (int i = 1, x; i <= q; i++) {
x = Read ();
for (int j = 1; j * j <= x; j++) {
if (x % j)
continue;
Cnt[j]++, Res = (Res + (LL)Phi[j] * (C (Cnt[j], k) - C (Cnt[j] - 1, k) + Mod) % Mod) % Mod;
if (j * j != x)
Cnt[x / j]++, Res = (Res + (LL)Phi[x / j] * (C (Cnt[x / j], k) - C (Cnt[x / j] - 1, k) + Mod) % Mod) % Mod;
}
Print (Res, '\n');
}
return 0;
}

Solution -「CF645F」Cowslip Collections的更多相关文章

  1. Solution -「构造」专练

    记录全思路过程和正解分析.全思路过程很 navie,不过很下饭不是嘛.会持续更新的(应该). 「CF1521E」Nastia and a Beautiful Matrix Thought. 要把所有数 ...

  2. Solution -「原创」Destiny

    题目背景 题目背景与题目描述无关.签到愉快. 「冷」 他半靠在床沿,一缕感伤在透亮的眼眸间荡漾. 冷见惆怅而四散逃去.经历嘈杂喧嚣,感官早已麻木.冷又见空洞而乘隙而入.从里向外,这不是感官的范畴. 他 ...

  3. Solution -「GLR-R2」教材运送

    \(\mathcal{Description}\)   Link.   给定一棵包含 \(n\) 个点,有点权和边权的树.设当前位置 \(s\)(初始时 \(s=1\)),每次在 \(n\) 个结点内 ...

  4. Solution -「WF2011」「BZOJ #3963」MachineWorks

    \(\mathcal{Description}\)   Link.   给定你初始拥有的钱数 \(C\) 以及 \(N\) 台机器的属性,第 \(i\) 台有属性 \((d_i,p_i,r_i,g_i ...

  5. Solution -「LOCAL」二进制的世界

    \(\mathcal{Description}\)   OurOJ.   给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...

  6. Solution -「SHOI2016」「洛谷 P4336」黑暗前的幻想乡

    \(\mathcal{Description}\)   link.   有一个 \(n\) 个结点的无向图,给定 \(n-1\) 组边集,求从每组边集选出恰一条边最终构成树的方案树.对 \(10^9+ ...

  7. Solution -「LOCAL」大括号树

    \(\mathcal{Description}\)   OurTeam & OurOJ.   给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...

  8. Solution -「ZJOI2012」「洛谷 P2597」灾难

    \(\mathcal{Description}\)   link.   给定一个捕食网络,对于每个物种,求其灭绝后有多少消费者失去所有食物来源.(一些名词与生物学的定义相同 w.)   原图结点数 \ ...

  9. Solution -「JSOI2008」「洛谷 P4208」最小生成树计数

    \(\mathcal{Description}\)   link.   给定带权简单无向图,求其最小生成树个数.   顶点数 \(n\le10^2\),边数 \(m\le10^3\),相同边权的边数不 ...

随机推荐

  1. Python技法:实现简单的递归下降Parser

    1. 算术运算表达式求值 在上一篇博文<Python技法:用re模块实现简易tokenizer>中,我们介绍了用正则表达式来匹配对应的模式,以实现简单的分词器.然而,正则表达式不是万能的, ...

  2. Linux-进程工具

    1.进程树 pstree pstree 可以用来显示进程的父子关系,以树形结构显示 格式: pstree [OPTION] [ PID | USER ] 常用选项: -p 显示PID -T 不显示线程 ...

  3. C#开发PACS医学影像三维重建(十三):基于人体CT值从皮肤渐变到骨骼的梯度透明思路

    当我们将CT切片重建为三维体之后,通常会消除一些不必要的外部组织来观察内部病灶, 一般思路是根据人体常见CT值范围来使得部分组织透明来达到效果, 但这是非黑即白的,即,要么显示皮肤,要么显示神经,要么 ...

  4. Django学习——分页器基本使用、分页器终极用法、forms组件之校验字段、forms组件之渲染标签、forms组件全局钩子,局部钩子

    内容 1 分页器基本使用 2 分页器终极用法 3 forms组件之校验字段 1 前端 <!DOCTYPE html> <html lang="en"> &l ...

  5. 图解Tire树+代码实现

    简介   Trie又称为前缀树或字典树,是一种有序树,它是一种专门用来处理串匹配的数据结构,用来解决一组字符中快速查找某个字符串的问题.Google搜索的关键字提示功能相信大家都不陌生,我们在输入框中 ...

  6. uniapp封装request方法及调用

    export default { doRequest(method, url, data) { // 如果data为空 if (!data) var data = [] var arr = [] ar ...

  7. 尾递归与 memorize 优化

    尾递归与 memorize 优化 本文写于 2020 年 12 月 10 日 递归 递归是一种非常常见的算法思维,在大家刚开始学编程的时候应该就会接触到. 我们可以这么理解递归: function 讲 ...

  8. git 1.2

    1.git服务器的搭建 gitlab 常用命令: gitlab-rails console -e production  进入控制台指令 sudo gitlab-ctl start # 启动所有 gi ...

  9. JavaScript 模块的循环加载(循环依赖问题分析)

    简介 "循环加载"(circular dependency)指的是,a 脚本的执行依赖 b 脚本,而 b 脚本的执行又依赖 a 脚本. 分析 使用 madge 工具进行循环加载分析 ...

  10. 637. Average of Levels in Binary Tree - LeetCode

    Question 637. Average of Levels in Binary Tree Solution 思路:定义一个map,层数作为key,value保存每层的元素个数和所有元素的和,遍历这 ...