link

题目大意:给您一个数 n, 每次从n的所有约数(包含1、n)中等概率选出一个约数替换n,重复操作k次,求最后结果期望值%1e9+7。

题解:考虑暴力,我们设f(n,k)代表答案,则有f(n,k)=sum_{d|n}f(d,k-1)。f(n,0)=n。

我们发现如果把n分解质因数,最后结果就是所有质因子若干次方结果乘积(f是积性函数)。

分解质因数后,我们设g(n,k)代表p^n次方执行k次的结果,由于n是log级别的,所以可以直接dp了。

最后得到了p^0…p^n的分布,加起来乘到答案里就行了。

代码

#include <cstdio>
using namespace std; const int xkj = 1000000007; long long n, k, tmp;
long long d[30];
int p[30], tot;
int f[60], g[60], inv[60]; int qpow(int x, int y)
{
int res = 1;
for (x %= xkj; y > 0; y >>= 1, x = x * (long long)x % xkj)
if (y & 1) res = res * (long long)x % xkj;
return res;
} int work(long long p, int m)
{
for (int i = 0; i < m; i++) f[i] = 0;
f[m] = 1;
for (int t = 1; t <= k; t++)
{
for (int i = 0; i <= m; i++) g[i] = 0;
for (int i = 0; i <= m; i++)
{
f[i] = f[i] * (long long)inv[i + 1] % xkj;
for (int j = 0; j <= i; j++)
{
g[j] = (g[j] + f[i]) % xkj;
}
}
for (int i = 0; i <= m; i++) f[i] = g[i];
}
int res = 0, tmp = 1; p %= xkj;
for (int j = 0; j <= m; j++) res = (res + f[j] * (long long)tmp % xkj) % xkj, tmp = tmp * p % xkj;
return res;
} int main()
{
scanf("%lld%lld", &n, &k); tmp = n;
for (int i = 0; i < 60; i++) inv[i] = qpow(i, xkj - 2);
for (int i = 2; i * (long long)i <= n; i++)
{
if (tmp % i == 0)
{
d[++tot] = i, p[tot] = 1, tmp /= i;
while (tmp % i == 0) tmp /= i, p[tot]++;
}
}
if (tmp > 1) d[++tot] = tmp, p[tot] = 1;
int ans = 1;
for (int i = 1; i <= tot; i++) ans = ans * (long long)work(d[i], p[i]) % xkj;
printf("%d\n", ans);
return 0;
}

CF1097D Makoto and a Blackboard(期望)的更多相关文章

  1. cf1097D. Makoto and a Blackboard(期望dp)

    题意 题目链接 Sol 首先考虑当\(n = p^x\),其中\(p\)是质数,显然它的因子只有\(1, p, p^2, \dots p^x\)(最多logn个) 那么可以直接dp, 设\(f[i][ ...

  2. CF1097D Makoto and a Blackboard

    题目地址:CF1097D Makoto and a Blackboard 首先考虑 \(n=p^c\) ( \(p\) 为质数)的情况,显然DP: 令 \(f_{i,j}\) 为第 \(i\) 次替换 ...

  3. CF1097D Makoto and a Blackboard(期望)

    [Luogu-CF1097D] 给定 \(n,k\)一共会进行 \(k\) 次操作 , 每次操作会把 \(n\) 等概率的变成 \(n\) 的某个约数 求操作 \(k\) 次后 \(n\) 的期望是多 ...

  4. CF1097D Makoto and a Blackboard 积性函数、概率期望、DP

    传送门 比赛秒写完ABC结果不会D--最后C还fst了qwq 首先可以想到一个约数个数\(^2\)乘上\(K\)的暴力DP,但是显然会被卡 在\(10^{15}\)范围内因数最多的数是\(978217 ...

  5. CF1097D Makoto and a Blackboard 质因数分解 DP

    Hello 2019 D 题意: 给定一个n,每次随机把n换成它的因数,问经过k次操作,最终的结果的期望. 思路: 一个数可以表示为质数的幂次的积.所以对于这个数,我们可以分别讨论他的质因子的情况. ...

  6. D Makoto and a Blackboard

    Makoto and a Blackboard time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  7. Codeforces1097D. Makoto and a Blackboard(数论+dp+概率期望)

    题目链接:传送门 题目大意: 给出一个整数n写在黑板上,每次操作会将黑板上的数(初始值为n)等概率随机替换成它的因子. 问k次操作之后,留在黑板上的数的期望. 要求结果对109+7取模,若结果不是整数 ...

  8. 【DP】【CF1097D】 Makoto and a Blackboard

    更好的阅读体验 Description 给定一个数 \(n\),对它进行 \(k\) 次操作,每次将当前的数改为自己的因数,包括 \(1\) 和自己.写出变成所有因数的概率是相等的.求 \(k\) 次 ...

  9. codeforces1097D Makoto and a Blackboard 数学+期望dp

    题目传送门 题目大意: 给出一个n和k,每次操作可以把n等概率的变成自己的某一个因数,(6可以变成1,2,3,6,并且概率相等),问经过k次操作后,期望是多少? 思路:数学和期望dp  好题好题!! ...

随机推荐

  1. 存储过程中使用事务和try catch

    一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 : Cre ...

  2. 377. Combination Sum IV 返回符合目标和的组数

    [抄题]: Given an integer array with all positive numbers and no duplicates, find the number of possibl ...

  3. 十大基于Docker的开发工具

    http://www.infoq.com/cn/news/2014/08/top-10-open-source-docker FlynnFlynn是一个使用Go语言编写的开源PaaS平台,Flynn使 ...

  4. centos7部署JavaWeb项目

    centos7部署JavaWeb项目共有三步 1.配置java环境 2.配置tomcat环境. 3.部署JavaWeb项目 一.配置java环境 1.1安装java 参考我的另一篇博文:https:/ ...

  5. HDU 2159 FATE (二维背包)

    题意:中文题. 析:dp[i][j] 已经杀了 i 个怪兽,已经用了 j 体积,所能获得的最大经验值,这个和一维的差不多,只是加一维而已. 代码如下: #pragma comment(linker, ...

  6. 一款基于uploadify扩展的多文件上传插件,完全适用于Html5

    http://www.uploadify.com/documentation/  官网里面有两个插件,一个是要使用flash插件才能文件上传的插件,另外一个是不需要使用要flash插件的文件上传插件完 ...

  7. 编写高质量代码改善C#程序的157个建议——建议93:构造方法应初始化主要属性和字段

    建议93:构造方法应初始化主要属性和字段 类型的属性应该在构造方法调用完毕前完成初始化工作.如果字段没有在初始化器中设置初始值,那么它就应该在构造方法中初始化. 类型一旦被实例化,那么它就应该被视为具 ...

  8. 对ArrayList(Vector)的排序

    当需要对ArrayList(Vector)里面的元素进行简单的排序时,可以使用Collections.sort();这个方法 import java.util.ArrayList; import ja ...

  9. javascript高级程序设计读书笔记----面向对象的程序设计

        创建对象   工厂模式 function createPerson(name, age, job){ var o = new Object(); o.name = name; o.age = ...

  10. java-03 变量与运算符

    1.java中的变量与常量 1.1 变量的定义: 变量,顾名思义就是会变的量,这种思想来源于数学,指的是一个不确定的量或者随时会改变的量. 在我们进行编程的过程中,有一些东西是会随着实际情况而发生变化 ...