Codeforces1097D. Makoto and a Blackboard(数论+dp+概率期望)
题目链接:传送门
题目大意:
给出一个整数n写在黑板上,每次操作会将黑板上的数(初始值为n)等概率随机替换成它的因子。
问k次操作之后,留在黑板上的数的期望。
要求结果对109+7取模,若结果不是整数,则用分数表示,并对109+7取逆元。
(1 ≤ n ≤ 1015, 1 ≤ k ≤ 104)
思路:
首先我们要知道,在模109+7的范围内,可以任意进行模109+7的加减乘除运算,因为一个给定的数值,它在模109+7条件下的值是唯一确定的。
然后我们只要正常地计算,在每次运算之后对109+7取模就好了。
假设一个数pj的出现概率为x,其中p为质数,j为任意非负整数(假设初始的数为pcc的话,那么0 ≤ j ≤ cc)。那么一次操作留下的数只能是pt(0 ≤ t ≤ j),因为是等概率分布,所以每个留下的数的概率均为x/j = x * inv(j)。(inv表示在模109+7下取逆元)
标记状态:dp[i][j]为第i次操作后p的j次幂出现的概率;
那么状态转移方程为:dp[i+1][t] += dp[i][j] * inv(j);(0 ≤ t ≤ j)
而题目给出的数可能不是一个质数的幂,这怎么办呢?我们知道任意一个正整数可以表示为p1cc1*p2cc2*…*pkcck,对于所有的picci,他们留下的数piji的乘积就是最后留下的数,所以他们对答案的贡献的乘积就是最后的答案。
代码:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int md = 1e9 + ;
- inline void add(int& a, int b) {
- a += b;
- if (a > md)
- a -= md;
- }
- inline void sub(int& a, int b) {
- a -= b;
- if (a < )
- a += md;
- }
- inline int mul(int a, int b) {
- return (int) (1LL * a * b % md);
- }
- int fpow(int a, int p) {
- int res = ;
- for (; p; p >>= ) {
- if (p & )
- res = mul(res, a);
- a = mul(a, a);
- }
- return res;
- }
- int inv(int x) {
- return fpow(x, md-);
- }
- int main()
- {
- std::ios::sync_with_stdio(false);
- cin.tie(nullptr);
- ll n;
- int k;
- cin >> n >> k;
- vector <pair<ll, int> > f;
- for (ll i = ; i <= n/i; i++) {
- if (n % i == ) {
- int cc = ;
- while (n % i == ) {
- n /= i;
- cc++;
- }
- f.emplace_back(i, cc);
- }
- }
- if (n > )
- f.emplace_back(n, );
- int ans = ;
- for (auto& p : f) {
- int cc = p.second;
- vector <vector<int> > dp(k+, vector<int>(cc+, ));
- dp[][cc] = ;
- for (int i = ; i < k; i++) {
- for (int j = ; j <= cc; j++) {
- int tmp = mul(dp[i][j], inv(j+));
- for (int t = ; t <= j; t++)
- add(dp[i+][t], tmp);
- }
- }
- int x = , res = ;
- for (int i = ; i <= cc; i++) {
- add(res, mul(x, dp[k][i]));
- x = mul(x, (int)(p.first % md));
- }
- ans = mul(ans, res);
- }
- cout << ans << endl;
- return ;
- }
Codeforces1097D. Makoto and a Blackboard(数论+dp+概率期望)的更多相关文章
- [LnOI2019]加特林轮盘赌(DP,概率期望)
[LnOI2019]加特林轮盘赌(DP,概率期望) 题目链接 题解: 首先特判掉\(p=0/1\)的情况... 先考虑如果\(k=1\)怎么做到\(n^2\)的时间复杂度 设\(f[i]\)表示有\( ...
- codeforces1097D Makoto and a Blackboard 数学+期望dp
题目传送门 题目大意: 给出一个n和k,每次操作可以把n等概率的变成自己的某一个因数,(6可以变成1,2,3,6,并且概率相等),问经过k次操作后,期望是多少? 思路:数学和期望dp 好题好题!! ...
- codeforces#1097 D. Makoto and a Blackboard(dp+期望)
题意:现在有一个数写在黑板上,它以等概率转化为它的一个约数,可以是1,问经过k次转化后这个数的期望值 题解:如果这个数是一个素数的n次方,那么显然可以用动态规划来求这个数的答案,否则的话,就对每个素因 ...
- hdu-5816 Hearthstone(状压dp+概率期望)
题目链接: Hearthstone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- hdu-5781 ATM Mechine(dp+概率期望)
题目链接: ATM Mechine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- BZOJ3566:[SHOI2014]概率充电器(树形DP,概率期望)
Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器, ...
- BZOJ4008:[HNOI2015]亚瑟王(DP,概率期望)
Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个 ...
- CF1097D Makoto and a Blackboard
题目地址:CF1097D Makoto and a Blackboard 首先考虑 \(n=p^c\) ( \(p\) 为质数)的情况,显然DP: 令 \(f_{i,j}\) 为第 \(i\) 次替换 ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
随机推荐
- 安装cmake 和 opencv 4.0.0
1.安装cmake3.5.1或更新的版本 安装gcc-c++:sudo apt-get install build-essential (或者直接执行这两条命令sudo apt-get install ...
- SQL SEVER 开窗函数总结
作为一名刚刚入门的开发人员,要学的东西很多很多,有些无从下手.秉着“问题是病.技术是药.对症下药”的原则,将工作中遇到的问题所需的技术进行梳理.归纳和总结. 一.什么是开窗函数 首先,什么是开窗函数, ...
- JavaScript 进制转换
//十进制转其他 var x=111; alert(x.toString(8)); alert(x.toString(16)); //其他转十进制 var x='112'; alert(parseIn ...
- 网络编程-day2
1 网络通信协议 Tcp udp的区别 重点(*****) TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存& ...
- 关于memset函数--赋最大值
问题起源: 这几天在刷CCF的时候,图论那边经常用到赋最大值,一开始自己一直手工for循环赋值(INT_MAX或者是LONG_LONG_MAX),后来看到别人的代码,发现了一个比较高端的赋值 mem ...
- android 重启app
package com.xproject.utility; import java.lang.reflect.Field; import java.lang.reflect.InvocationTar ...
- vue+uwsgi+nginx部署前后端分离项目
前后端分离,vue前端提供静态页面,且可以向后台发起get,post等restful请求. django后台提供数据支撑,返回json数据,返回给vue,进行数据页面渲染 后端 创建虚拟环境 解决dj ...
- tensorflow 只恢复部分模型参数
import tensorflow as tf def model_1(): with tf.variable_scope("var_a"): a = tf.Variable(in ...
- Android中软键盘展示、EditText焦点获取及windowSoftInputMode属性探究
2017-08-14 21:44:23 有很多中情况,分别展示. 1.Activity不做任何设置,布局使用LinearLayout 会自动滚动EditText之上的所有View,代码: <?x ...
- 动态规划Dynamic Programming
动态规划Dynamic Programming code教你做人:DP其实不算是一种算法,而是一种思想/思路,分阶段决策的思路 理解动态规划: 递归与动态规划的联系与区别 -> 记忆化搜索 -& ...