UVA 11762 Race to 1 数学期望 概率 记忆化搜索
给出一个整数N 每次可以在不超过N的素数中随机选择以个P, 如果P是N的约数,则把N变成N/P ,否则N不变 。 问平均状况下需要多少次随机选择才能把N变为1 ?
N<=1e6
int prime[maxn]; int vis[maxn]; double f[maxn]; int euler_sieve(int n) { int cnt = 0; for (int i = 2; i <= n; i++) { if (!vis[i]) prime[cnt++] = i; for (int j = 0; j < cnt; j++) { if (i * prime[j] > n) break; vis[i * prime[j]] = 1; if (i % prime[j] == 0) break; } } return cnt; } bool mp[maxn]; int p_cnt; double dp(int x) { if (x == 1) return 0; if (mp[x]) return f[x]; mp[x] = 1; double& ans = f[x]; int g = 0, p = 0; ans = 0; for (int i = 0; i < p_cnt && prime[i] <= x; i++) { p++; if (x % prime[i] == 0) { g++; ans += dp(x / prime[i]); } } ans = (ans + p) / g; return ans; } int main() { p_cnt = euler_sieve(1000005); int T; int n; int kase = 1; scanf("%d", &T); while (T--) { scanf("%d", &n); printf("Case %d: %.7f\n", kase++ ,dp(n)); } }