CodeForces 1842G Tenzing and Random Operations
原来还不会这种拆期望的套路
设 为第 次操作中选择的 ,所求即为 。
乘法也可以考虑拆期望。我们有最基础的性质 ,这个也可以推广到多个数。于是最后拆成了若干个 和若干个 的积,求这些乘积的和。
如果对于同样的 ,要计算 ,其中 ,注意到我们只需要关心 。因为如果它是 ,那整条式子的值就是 ;如果它不是 ,那后面的 都是 。
到这里就可以 dp 了。设 为,当前乘积的所有项中出现了 个不同的 ,乘积的和。转移讨论 是取 还是某一项 乘上去。如果是后者,还要讨论 是不是当前第一次出现的,如果是,那么 ;否则 。
时间复杂度 。
code
// Problem: G. Tenzing and Random Operations // Contest: Codeforces - CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!) // URL: https://codeforces.com/contest/1842/problem/G // Memory Limit: 1024 MB // Time Limit: 2000 ms // // Powered by CP Editor (https://cpeditor.org) #include <bits/stdc++.h> #define pb emplace_back #define fst first #define scd second #define mems(a, x) memset((a), (x), sizeof(a)) using namespace std; typedef long long ll; typedef unsigned long long ull; typedef double db; typedef long double ldb; typedef pair<ll, ll> pii; const int maxn = 5050; const ll mod = 1000000007; inline ll qpow(ll b, ll p) { ll res = 1; while (p) { if (p & 1) { res = res * b % mod; } b = b * b % mod; p >>= 1; } return res; } ll n, m, K, a[maxn], f[maxn][maxn]; void solve() { scanf("%lld%lld%lld", &n, &m, &K); ll I = qpow(n, mod - 2); for (int i = 1; i <= n; ++i) { scanf("%lld", &a[i]); } f[0][0] = 1; for (int i = 1; i <= n; ++i) { for (int j = 0; j <= i; ++j) { f[i][j] = f[i - 1][j] * (a[i] + K * j % mod) % mod; if (j) { f[i][j] = (f[i][j] + f[i - 1][j - 1] * (m - j + 1) % mod * i % mod * I % mod * K % mod) % mod; } } } ll ans = 0; for (int i = 0; i <= n; ++i) { ans = (ans + f[n][i]) % mod; } printf("%lld\n", ans); } int main() { int T = 1; // scanf("%d", &T); while (T--) { solve(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App