IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> CF1139D Steps to One 题解 -> 正文阅读

[人工智能]CF1139D Steps to One 题解

一道莫反好题。

先证个式子: E ( X ) = ∑ i ≥ 1 P ( X ≥ i ) E(X)=\sum_{i\ge 1}P(X \ge i) E(X)=i1?P(Xi),也就是最终长度为 X X X 的期望是所有最终长度小于等于 X X X 的概率之和。

证明: E ( X ) = ∑ i ≥ 1 i P ( X = i ) = ∑ i ≥ 1 ∑ 1 ≤ j ≤ i P ( X = i ) = ∑ j ≥ 1 ∑ i ≥ j P ( X = i ) = ∑ j ≥ 1 P ( x ≥ j ) E(X)=\sum_{i\ge 1}iP(X=i)=\sum_{i\ge 1}\sum_{1\le j\le i}P(X=i)=\sum_{j\ge 1}\sum_{i\ge j}P(X=i)=\sum_{j\ge1}P(x\ge j) E(X)=i1?iP(X=i)=i1?1ji?P(X=i)=j1?ij?P(X=i)=j1?P(xj)

考虑容斥,最终长度大于等于 i i i 等价于长度为 i ? 1 i-1 i?1 的序列 gcd ? \gcd gcd 大于 1,这个可以用 1 减去 gcd ? = 1 \gcd=1 gcd=1 的概率,注意这里的 i ≥ 2 i \ge 2 i2

概率用满足条件方案数 / 总方案数计算,总方案数 m i ? 1 m^{i-1} mi?1,因此只需要计算 i ? 1 i-1 i?1 gcd ? = 1 \gcd=1 gcd=1 的方案数即可。

gcd ? = 1 \gcd=1 gcd=1 的式子: ∑ 1 ≤ a 1 , a 2 , . . . , a i ? 1 ≤ m [ gcd ? ( a 1 , a 2 , . . . , a i ? 1 ) = 1 ] \sum_{1 \le a_1,a_2,...,a_{i-1} \le m}[\gcd(a_1,a_2,...,a_{i-1})=1] 1a1?,a2?,...,ai?1?m?[gcd(a1?,a2?,...,ai?1?)=1]

莫比乌斯反演,得到 ∑ 1 ≤ a 1 , a 2 , . . . , a i ? 1 ≤ m ∑ d ∣ gcd ? ( a 1 , a 2 , . . . , a i ? 1 ) μ ( d ) \sum_{1 \le a_1,a_2,...,a_{i-1}\le m}\sum_{d \mid \gcd(a_1,a_2,...,a_{i-1})}\mu(d) 1a1?,a2?,...,ai?1?m?dgcd(a1?,a2?,...,ai?1?)?μ(d)

换个枚举顺序,顺便处理一下求和符号得到 ∑ d = 1 m μ ( d ) ? m d ? i ? 1 \sum_{d=1}^{m}\mu(d)\lfloor\dfrac{m}{d}\rfloor^{i-1} d=1m?μ(d)?dm??i?1

然后开始计算答案式子,为 1 + ∑ i ≥ 2 m i ? 1 ? ∑ d = 1 m μ ( d ) ? m d ? i ? 1 m i ? 1 1+\sum_{i\ge2}\dfrac{m^{i-1}-\sum_{d=1}^m\mu(d)\lfloor\dfrac{m}{d}\rfloor^{i-1}}{m^{i-1}} 1+i2?mi?1mi?1?d=1m?μ(d)?dm??i?1?

i ? 1 i-1 i?1 太丑,令 i ← i ? 1 i \gets i-1 ii?1,得到 1 + ∑ i ≥ 1 m i ? ∑ d = 1 m μ ( d ) ? m d ? i m i 1+\sum_{i\ge1}\dfrac{m^i-\sum_{d=1}^m\mu(d)\lfloor\dfrac{m}{d}\rfloor^i}{m^i} 1+i1?mimi?d=1m?μ(d)?dm??i?

注意到 d = 1 d=1 d=1 ∑ d = 1 m μ ( d ) ? m d ? i = m i \sum_{d=1}^{m}\mu(d)\lfloor\dfrac{m}{d}\rfloor^i=m^i d=1m?μ(d)?dm??i=mi,因此将这一部分提出来与 m i m^i mi 消掉。

然后交换求和符号,得到 1 ? ∑ d = 1 m μ ( d ) ( ? m d ? m ) i 1-\sum_{d=1}^{m}\mu(d)(\dfrac{\lfloor\frac{m}{d}\rfloor}{m})^i 1?d=1m?μ(d)(m?dm???)i

因为 ? m d ? m < 1 \dfrac{\lfloor\frac{m}{d}\rfloor}{m}<1 m?dm???<1,根据 x < 1 → ∑ i ≥ 1 x i = x 1 ? x x<1 \to \sum_{i\ge1}x^i=\dfrac{x}{1-x} x<1i1?xi=1?xx?(貌似是用生成函数推的),得到 1 ? ∑ d = 1 m μ ( d ) ? m d ? m m ? ? m d ? m 1-\sum_{d=1}^{m}\mu(d)\dfrac{\dfrac{\lfloor\frac{m}{d}\rfloor}{m}}{m-\dfrac{\lfloor\frac{m}{d}\rfloor}{m}} 1?d=1m?μ(d)m?m?dm???m?dm????,然后整除分块即可。

GitHub:CodeBase-of-Plozia

Code:

/*
========= Plozia =========
	Author:Plozia
	Problem:CF1139D Steps to One
	Date:2022/3/1
========= Plozia =========
*/

#include <bits/stdc++.h>

typedef long long LL;
const int MAXN = 1e5 + 5;
const LL P = 1e9 + 7;
int t, n, cntPrime, Prime[MAXN];
LL mu[MAXN], inv[MAXN];
bool book[MAXN];

int Read()
{
	int sum = 0, fh = 1; char ch = getchar();
	for (; ch < '0' || ch > '9'; ch = getchar()) fh -= (ch == '-') << 1;
	for (; ch >= '0' && ch <= '9'; ch = getchar()) sum = sum * 10 + (ch ^ 48);
	return sum * fh;
}
int Max(int fir, int sec) { return (fir > sec) ? fir : sec; }
int Min(int fir, int sec) { return (fir < sec) ? fir : sec; }
LL ksm(LL a, LL b = P - 2, LL p = P)
{
	LL s = 1 % p;
	for (; b; b >>= 1, a = a * a % p)
		if (b & 1) s = s * a % p;
	return s;
}

void init()
{
	book[1] = mu[1] = 1;
	for (int i = 2; i <= n; ++i)
	{
		if (!book[i]) { Prime[++cntPrime] = i; mu[i] = -1; }
		for (int j = 1; j <= cntPrime; ++j)
		{
			if (i * Prime[j] > n) break ;
			book[i * Prime[j]] = 1;
			if(i % Prime[j] == 0) { mu[i * Prime[j]] = 0; break ; }
			mu[i * Prime[j]] = -mu[i];
		}
	}
	for (int i = 2; i <= n; ++i) mu[i] = mu[i - 1] + mu[i];
}

int main()
{
	n = Read(); init(); LL ans = 0;
	for (int i = 1; i <= n; ++i) inv[i] = ksm(i);
	for (int l = 2, r; l <= n; l = r + 1)
	{
		r = Min(n / (n / l), n);
		ans = (ans + (mu[r] - mu[l - 1]) * (n / l) % P * inv[n - (n / l)] % P) % P;
	}
	ans = ((1 - ans) % P + P) % P;
	printf("%lld\n", ans);
	return 0;
}
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:13:20  更:2022-03-03 16:17:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:36:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码