CF 1097D Makoto and a Blackboard
算是记一下昨天晚上都想了些什么
官方题解 点我
简单题意
给定两个正整数$n$和$k$,定义一步操作为把当前的数字$n$等概率地变成$n$的任何一个约数,求$k$步操作后的期望数字,模$1e9 + 7$。
$$n \leq 10^{15}, k \leq 10^4$$
我的思路
设$f(n, k)$表示$n$在$k$步操作之后的期望数字,假设$n$的约数有$m$个,分别为$d_1, d_2, \dots, d_m$,有递推式
$$f(n, k) = \frac{1}{m}\sum_{i = 1}^{m}f(d_i, k - 1)$$
边界条件显然是$f(n, 0) = n$。
直接暴算的话一共有$n * k$个状态,无法承受。
接下来证明:$f(a, k) * f(b, k) = f(ab, k)$,(其中$a, b$互质)。
数学归纳法来了(逃)
1、$k = 0$的时候显然成立。
2、假设在$k - 1$的时候成立。
我们设$a$有$n$个约数,$b$有$m$个约数,因为约数个数$\sigma$是一个积性函数,所以$ab$的约数个数有$nm$个。
那么根据递推式,有
$$f(ab, k) = \frac{1}{nm}\sum_{d | ab}f(d, k - 1)$$
$$f(a, k) * f(b, k) = \frac{1}{n}\sum_{i | a}f(i, k - 1)\frac{1}{m}\sum_{j | b}f(j, k - 1) = \frac{1}{nm}\sum_{i | a}\sum_{j | b}f(i, k - 1) * f(j, k - 1)$$
要证$f(ab, k) = f(a, k) * f(b, k)$,
即证$\sum_{d | ab}f(d, k - 1) = \sum_{i | a}\sum_{j | b}f(i, k - 1) * f(j, k - 1)$,
右边的式子变形一下
$$\sum_{i | ab}\sum_{j | i \& j | a}f(j, k - 1) * f(\frac{i}{j}, k - 1)[gcd(j, \frac{i}{j} == 1)]$$
把$ab$分解质因数变成$\prod_{i = 1}^{m}p_i^{c_i}$的形式。
注意到$a$、$b$互质,那么$gcd(j, \frac{i}{j}) == 1$的时候其实只有一种,那就是$j$恰好取完了某个或某几个$p_i^{c_i}$的时候,这时候有$f(d, k - 1) = f(i, k - 1) * f(\frac{d}{i}, k - 1)[gcd(d, a) == i]$。
代进去之后发现两式相等了。
这样子的话我们就得到了$f$函数一个类似于积性的性质,于是我们可以直接把$n$分解成$\prod_{i = 1}^{m}p_i^{c_i}$的形式,然后分别计算每一个$p_i^{c_i}$的答案最后乘起来。
发现这样子状态数十分有限,只有$klogn$个,所以直接暴力算就可以了。
时间复杂度应当是$O(\sqrt{n} + klogn)$。
代码非常乱。
Code:
#include <cstdio>
#include <cstring>
#include <map>
#include <vector>
#include <algorithm>
#define rep(i, a, b) for (int i = (a); i <= (b); i++)
#define per(i, a, b) for (int i = (a); i >= (b); i--)
using namespace std;
typedef long long ll;
typedef pair <ll, int> pin; const ll P = 1e9 + ; ll ans = 1LL, g[][], inv[];
bool vis[][]; map <pin, ll> mp; template <typename T>
inline void inc(T &x, T y) {
x += y;
if (x >= P) x -= P;
} inline ll fpow(ll x, ll y) {
ll res = 1LL;
for (; y > ; y >>= ) {
if (y & ) res = res * x % P;
x = x * x % P;
}
return res;
} ll f(ll p, int m, int k) {
if (p == ) return 1LL;
if (k == ) return fpow(p, m);
if (vis[m][k]) return g[m][k]; vis[m][k] = ; ll res = ;
rep(i, , m) inc(res, f(p, i, k - ) * inv[m + ] % P); return g[m][k] = res;
} inline void solve(ll p, int m, int k) {
rep(i, , m) rep(j, , k) g[i][j] = , vis[i][j] = ;
ans = ans * f(p, m, k) % P;
} int main() {
// freopen("Sample.txt", "r", stdin);
// freopen("out.txt", "w", stdout); rep(i, , ) inv[i] = fpow(i, P - ); ll n; int k;
scanf("%I64d%d", &n, &k); ll tmp = n;
for (ll i = ; i * i <= n; i++) {
if (tmp % i == ) {
int m = ;
for (; tmp % i == ; tmp /= i, ++m);
solve(i, m, k);
}
}
if (tmp > ) solve(tmp, , k); printf("%I64d\n", ans);
return ;
}
CF 1097D Makoto and a Blackboard的更多相关文章
- Codeforces 1097D. Makoto and a Blackboard
传送门 首先考虑如果 $n$ 只有一个质因数的情况,即 $n=p^t$ 那么显然可以 $dp$ ,设 $f[i][j]$ 表示第 $i$ 步,当前剩下 $p^j$ 的概率 那么转移很简单: $f[i] ...
- CF1097D Makoto and a Blackboard
题目地址:CF1097D Makoto and a Blackboard 首先考虑 \(n=p^c\) ( \(p\) 为质数)的情况,显然DP: 令 \(f_{i,j}\) 为第 \(i\) 次替换 ...
- D Makoto and a Blackboard
Makoto and a Blackboard time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- CF 1097D - Hello 2019 D题: Makoto and a Blackboard
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门 Portal 原题目描述在最下面. 给一个数n ...
- CodeForces - 1097D:Makoto and a Blackboard (积性)
Makoto has a big blackboard with a positive integer n written on it. He will perform the following a ...
- Makoto and a Blackboard CodeForces - 1097D (积性函数dp)
大意: 初始一个数字$n$, 每次操作随机变为$n$的一个因子, 求$k$次操作后的期望值. 设$n$经过$k$次操作后期望为$f_k(n)$. 就有$f_0(n)=n$, $f_k(n)=\frac ...
- CF 878E Numbers on the blackboard 并查集 离线 贪心
LINK:Numbers on the blackboard 看完题觉得很难. 想了一会发现有点水 又想了一下发现有点困难. 最终想到了 但是实现的时候 也很难. 先观察题目中的这个形式 使得前后两个 ...
- Codeforces1097D. Makoto and a Blackboard(数论+dp+概率期望)
题目链接:传送门 题目大意: 给出一个整数n写在黑板上,每次操作会将黑板上的数(初始值为n)等概率随机替换成它的因子. 问k次操作之后,留在黑板上的数的期望. 要求结果对109+7取模,若结果不是整数 ...
- codeforces#1097 D. Makoto and a Blackboard(dp+期望)
题意:现在有一个数写在黑板上,它以等概率转化为它的一个约数,可以是1,问经过k次转化后这个数的期望值 题解:如果这个数是一个素数的n次方,那么显然可以用动态规划来求这个数的答案,否则的话,就对每个素因 ...
随机推荐
- struts2学习(12)struts2验证框架2.自定义验证
一.例子需求: 对敏感词进行验证: 将struts包中的validators.xml文件拷贝一份到src目录下,在最后面添加自己的验证器: com.cy.validators.SensitiveWor ...
- Timesten 日常管理命令合集
Timesten 日常管理命令合集 以下所有操作都是基于TT 11 版,早前版本本人没用过,命令是否适用我不清楚啊! 各类服务管理 一.TT的启停 停服务: 1.停止复制与cache 进程: ...
- excel打开csv 出现乱码怎么解决
CSV是逗号分隔值的英文缩写,通常都是纯文本文件.CSV格式是分隔的数据格式,有字段/列分隔的逗号字符和记录/行分隔换行符.通常CSV文件可以用EXCEL正常打开,但是许多人都有这样的经历,使用EXC ...
- Windows Server 2012十大实用快捷键组合
在本文中,我们将一起体验快捷键如何在微软最新服务器操作系统中帮助用户提升工作效率. 微软推出的最新服务器操作系统比我印象中任何一款前代Windows Server产品都依赖于键盘操作——当然,这些产品 ...
- 重载(overload),覆盖(override),隐藏(hide)的区别
写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide).在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的, ...
- 【UVA】536 Tree Recovery(树型结构基础)
题目 题目 分析 莫名A了 代码 #include <bits/stdc++.h> using namespace std; string s1,s2; void buil ...
- 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)
Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(转)
开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 日程管理 http://ww ...
- CocoStudio资源区导入Plist/PSD文件
这两种文件在使用中和普通文件稍有不同,下作简单介绍.如有不适的地方欢迎批评指正. 首先简单说一下Plist文件,Plist文件通常用于储存用户设置,也可以用于存储捆绑的信息,该功能在旧式的Mac OS ...
- python开发_自己开发的一个小游戏
先看看游戏的运行效果: 看完游戏的运行情况,你可能对游戏有了一定了了解: #运行游戏后,玩家首先要进行语音的选择,1选择英语,2选择汉语,其他则默认选择英语 #根据玩家选择的语音,进入不同的语音环境 ...