不太会期望题,记一下有用的想法。
思路
期望 + 莫反。
设 E(l) 为序列长度的期望,P(x) 为事件 x 发生的概率。
首先根据期望的定义有 E(l)=∑i≥1P(l=i)⋅i
等价于 E(l)=∑i≥1P(l=i)i∑j=1
即 E(l)=∑j≥1∑i≥jP(l=i)
根据定义得 E(l)=∑i≥1P(l≥i)=1+∑i≥1P(l>i)
考虑求出 P(l>i).
根据 P(l=i) 的定义知 P(l=i)=m∑a1=1⋯m∑ai=1[gcd(a1,⋯,ai)=1]mi
所以 P(l>i)=m∑a1=1⋯m∑ai=1[gcd(a1,⋯,ai)>1]mi
因为 gcd(a1,⋯,ai)≥1,所以 P(gcd(a1,⋯,ai)>1)=1−P(gcd(a1,⋯,ai)=1)
所以 P(l>i)=1−m∑a1=1⋯m∑ai=1[gcd(a1,⋯,ai)=1]mi
根据 μ 的性质知 P(l>i)=1−m∑a1=1⋯m∑ai=1∑d∣gcd(a1,⋯,ai)μ(d)mi
根据莫反套路可以推导出:P(l>i)=1−m∑d=1μ(d)⋅(⌊md⌋)imi
因为 d=1 时后一项的值等于 −1,所以可以抵消:
P(l>i)=−m∑d=2μ(d)⋅(⌊md⌋)imi
将 P(l>i) 代入回 E(l):
E(l)=1+∑i≥1P(l>i)=1−∑i≥1m∑d=2μ(d)⋅(⌊md⌋)imi
整理可得 E(l)=1−m∑d=2∑i≥1μ(d)⋅(⌊md⌋m)i
根据等比数列求和公式可以继续化简:
E(l)=1−m∑d=2μ(d)⋅⌊md⌋m−⌊md⌋
然后直接筛出 μ 求值就行,时间复杂度 O(mlogV)
代码
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
int n;
int mu[maxn];
vector<int> p;
bitset<maxn> vis;
int qpow(int base, int power)
{
int res = 1;
while (power)
{
if (power & 1) res = 1ll * res * base % mod;
base = 1ll * base * base % mod;
power >>= 1;
}
return res;
}
void init()
{
mu[1] = 1, vis[1] = true;
for (int i = 2; i <= n; i++)
{
if (!vis[i]) p.push_back(i), mu[i] = -1;
for (int j = 0; (j < p.size()) && (i * p[j] <= n); j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0) { mu[i * p[j]] = 0; break; }
else mu[i * p[j]] = -mu[i];
}
}
}
int main()
{
scanf("%d", &n);
init();
int ans = 1;
for (int i = 2; i <= n; i++) ans = (ans - 1ll * mu[i] * (n / i) % mod * qpow(n - n / i, mod - 2) % mod + mod) % mod;
printf("%d\n", ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】