解题报告(十八)Codeforces - 数学题目泛做(难度:2000 ~ 3000 + )
Posted 繁凡さん
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解题报告(十八)Codeforces - 数学题目泛做(难度:2000 ~ 3000 + )相关的知识,希望对你有一定的参考价值。
整理的算法模板合集: ACM模板
实际上是一个全新的精炼模板整合计划
繁凡出品的全新系列:解题报告系列 —— 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数( 1 ∼ 5 1 \\sim 5 1∼5),以模板题难度 1 1 1 为基准。
这样大家在学习算法的时候就可以执行这样的流程:
%
阅读【学习笔记】 / 【算法全家桶】学习算法 ⇒ \\Rightarrow ⇒ 阅读相应算法的【解题报告】获得高质量题单 ⇒ \\Rightarrow ⇒ 根据一句话题解的提示尝试自己解决问题 ⇒ \\Rightarrow ⇒ 点开详细题解链接学习巩固(好耶)
%
要是26个英文字母用完了我就接上24个希腊字母,我就不信50道题不够我刷的hhh%
解题报告系列合集:【解题报告系列】超高质量题单 + 题解(ICPC / CCPC / NOIP / NOI / CF / AT / NC / P / BZOJ)
本题单前置知识:《算法竞赛中的初等数论》(ACM / OI / MO)前言、后记、目录索引(十五万字符的数论书)
Codeforces - 数学题目泛做(难度:2000 ~ 3000 + )
题单链接:https://codeforces.com/problemset/page/6?tags=math&order=BY_RATING_DESC
%为了节省篇幅代码我全都放到链接里了( [https://paste.ubuntu.com/](https://paste.ubuntu.com/))
专门挑了一些最简单的题写hhh,好像绝大多数都是数论题hhh,后面会慢慢加一些其他的数学题目进来
目录
难度:2000 分
A. CF803F Coprime Subsequences(容斥原理,莫比乌斯函数)
Problem
给定一个 n n n 个数的序列,问你有多少个子序列的 gcd = 1 \\gcd=1 gcd=1 。
Solution
序列一共有 n n n 个数,显然一共有 2 n − 1 2^n-1 2n−1 个子序列(每个数选或不选减去空集)
考虑容斥。显然答案就是 2 n − 1 2^n-1 2n−1 减去 gcd > 1 \\gcd>1 gcd>1 的子序列个数,设所有含有大于 1 1 1 的因子的序列中的个数为 x x x ,显然 gcd > 1 \\gcd>1 gcd>1 的子序列的个数为 2 x − 1 2^x-1 2x−1。显然只与点的权值有关,而 a [ i ] ≤ 1 0 5 a[i]\\le 10^5 a[i]≤105,考虑维护权值。设序列中的数的最大值为 m m m。
-
设 c n t i cnt_i cnti 表示权值为 i i i 的序列中的数的个数,可以在输入的时候处理一下。
-
设 s u m i sum_i sumi 表示含有因子 i i i 的数的个数,显然 s u m i = ∑ i ∣ j c n t j \\displaystyle sum_i=\\sum\\limits_{i|j}{cnt_j} sumi=i∣j∑cntj,即序列中 i i i 的倍数的个数。我们可以通过枚举倍数在 O ( m l o g m ) O(mlogm) O(mlogm) 的复杂度下计算。
-
设 f i f_i fi 表示含有因子 i i i 的子序列的个数,显然 f i = 2 s u m i − 1 = 2 ∑ i ∣ j c n t j − 1 \\displaystyle f_i=2^{sum_i}-1=2^{\\sum\\limits_{i|j}{cnt_j}}-1 fi=2sumi−1=2i∣j∑cntj−1,显然 s u m < m ≤ 1 0 5 sum<m\\le10^5 sum<m≤105,我们可以 O ( m ) O(m) O(m) 预处理一下 2 2 2 的次幂。
对于 gcd > 1 \\gcd>1 gcd>1 的子序列个数,根据奇加偶减的容斥原理,显然为:含有因子 2 2 2 的子序列的个数( f 2 f_2 f2) + + + 含有因子 3 3 3 的子序列的个数( f 3 f_3 f3) + + + 含有因子 5 5 5 的子序列的个数( f 5 f_5 f5) + + + ⋯ \\cdots ⋯ − - − 含有因子 2 , 3 2,3 2,3 的子序列的个数( f 6 f_6 f6) − - − 含有因子 2 , 5 2,5 2,5 的子序列的个数( f 10 f_{10} f10) − ⋯ -\\cdots −⋯ + 含有因子 2 , 3 , 5 2,3,5 2,3,5( f 30 f_{30} f30) 的子序列的个数 + ⋯ +\\cdots +⋯
最终的答案为 2 n − 1 2^n-1 2n−1 减去 gcd > 1 \\gcd>1 gcd>1 的子序列个数,即变为奇减偶加的形式,然后我们可以发现前面 f x f_x fx 的系数实际上就是 μ ( x ) \\mu(x) μ(x)(莫比乌斯函数本身就是一个容斥的映射)。
即答案为
2
n
−
1
+
∑
i
=
2
m
μ
(
i
)
×
f
i
2^n-1+\\sum_{i=2}^{m}\\mu(i)\\times f_i
2n−1+i=2∑mμ(i)×fi
Time
O ( m l o g m ) , m = max { a [ i ] } O(mlogm),m=\\max\\{a[i]\\} O(mlogm),m=max{a[i]}
Code
// Problem: CF803F Coprime Subsequences
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF803F
// Memory Limit: 250 MB
// Time Limit: 2000 ms
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
const int N = 500007, mod = 1e9 + 7;
typedef long long ll;
int n, m, t;
int a[N], mu[N], cnt[N];
bool vis[N];
int primes[N], tot;
int pow2[N];
ll ans;
int add(int a, int b)
{
return 1ll * a + b >= mod ? 1ll * a + b - mod : 1ll * a + b;
}
int sub(int a, int b)
{
return a - b < 0 ? a 以上是关于解题报告(十八)Codeforces - 数学题目泛做(难度:2000 ~ 3000 + )的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 120 Editorial E解题报告
Educational Codeforces Round 120 Editorial E解题报告