解题报告(十八)Codeforces - 数学题目泛做(难度:2000 ~ 3000 + )

Posted 繁凡さん

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解题报告(十八)Codeforces - 数学题目泛做(难度:2000 ~ 3000 + )相关的知识,希望对你有一定的参考价值。

整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


繁凡出品的全新系列:解题报告系列 —— 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数( 1 ∼ 5 1 \\sim 5 15),以模板题难度 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 2n1 个子序列(每个数选或不选减去空集)

考虑容斥。显然答案就是 2 n − 1 2^n-1 2n1 减去 gcd ⁡ > 1 \\gcd>1 gcd>1 的子序列个数,设所有含有大于 1 1 1 的因子的序列中的个数为 x x x ,显然 gcd ⁡ > 1 \\gcd>1 gcd>1 的子序列的个数为 2 x − 1 2^x-1 2x1。显然只与点的权值有关,而 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=ijcntj,即序列中 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=2sumi1=2ijcntj1,显然 s u m < m ≤ 1 0 5 sum<m\\le10^5 sum<m105,我们可以 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 2n1 减去 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 2n1+i=2mμ(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解题报告

Educational Codeforces Round 120 Editorial E解题报告

codeforces 158B-C语言解题报告

codeforces 122A-C语言解题报告

codeforces 281A-C语言解题报告