我们考虑对于一个\(N\),他如果变成了他的约数\(x\),那又会变成一个子问题

我们定义\(F(n, k)\)为n操作k次的期望个数

那么我们有\(F(n, k) =\sum_{x|n} F(x, k - 1) * \frac{1}{d}\)(其中d为n的约数个数)

因为\(N\)的约数个数肯定在\(\sqrt N\)以内现在我们就有了一个\(O(\sqrt N K)\)的暴力了

前面的\(\sqrt N\)肯定是不能省略了,我们可不可以对\(K\)下手呢?

我们考虑\(N\)是质数,那么答案为\(\frac{N + 2^k - 1}{2^k}\)

再考虑一波\(N = p^x\)其中p是质数,那么我们考虑用上述\(DP求解\)

设$dp[i][j] \(为第i此操作后,为\)p^j$的概率

\(dp[i][j] = \sum_{l = 1}^x dp[i - 1][l] * \frac{1}{j}\)

最后的答案为\(\sum_{j = 1}^{x} dp[k][j] * p^j\)

我们发现每一个\(p_i^{j}\)互不影响,这又是一个积性函数

\(sum[i][j] * sum[i][k] = sum[i][j * k](gcd(j, k) == 1)\)

证明的话我们一样回归定义,假设变成\(p_1^j * p_2^0\)的概率为x,\(p_1^0 *p_2^k\)的概率为y,那么\(p_1^j*p_2^k\)的概率一定为\(x*y\)

于是我们只需要对\(N\)分解质因数后再套一个\(\prod\)即可

这样的复杂度是\(\sqrt N + K * log^3N=10^9\)

但是由于\(log\)不一定为2,所以这个复杂度是可以过这道题的

\(Code:\)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
#define il inline
#define re register
#define debug printf("Now is Line : %d\n",__LINE__)
#define file(a) freopen(#a".in","r",stdin);freopen(#a".out","w",stdout)
#define int long long
#define D double
#define inf 123456789
#define mod 1000000007
il int read() {
re int x = 0, f = 1; re char c = getchar();
while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x * f;
}
#define rep(i, s, t) for(re int i = s; i <= t; ++ i)
#define drep(i, s, t) for(re int i = t; i >= s; -- i)
#define Next(i, u) for(re int i = head[u]; i; i = e[i].next)
#define mem(k, p) memset(k, p, sizeof(k))
#define lb(x) (x)&(-(x))
#define ls k * 2
#define rs k * 2 + 1
#define maxn 1000005
int n, m, prim[maxn], tot, dis[maxn], dp[maxn][20], ans, inv[100], Ans = 1;
il void get(int x) {
for(re int i = 2; i * i <= x; ++ i) {
if(x % i == 0) prim[++ tot] = i;
while(x % i == 0) x /= i, ++ dis[tot];
}
if(x != 1) prim[++ tot] = x, ++ dis[tot];
}
il int qpow(int a, int b) {
int r = 1;
while(b) {
if(b & 1) r = r * a % mod;
b >>= 1, a = a * a % mod;
}
return r;
}
signed main() {
n = read(), m = read();
get(n);
rep(i, 1, 60) inv[i] = qpow(i, mod - 2);
rep(T, 1, tot) {
mem(dp, 0), dp[0][dis[T]] = 1, ans = 0;
rep(i, 1, m) {
rep(j, 0, dis[T]) {
rep(k, j, dis[T]) dp[i][j] = (dp[i - 1][k] * inv[k + 1] + dp[i][j]) % mod;
}
}
rep(i, 0, dis[T]) ans = (ans + dp[m][i] * qpow(prim[T] % mod, i) % mod);
Ans = ans * Ans % mod;
}
printf("%lld", Ans);
return 0;
}

CF1097D 【Makoto and a Blackboard】的更多相关文章

  1. CF1097D Makoto and a Blackboard

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

  2. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  3. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  4. 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付

    前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...

  5. 【AutoMapper官方文档】DTO与Domin Model相互转换(上)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  6. 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

    由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...

  7. 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包

            微信支付教程系列之现金红包           最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...

  8. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

  9. 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付         今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...

随机推荐

  1. 集成maven和Spring boot的profile

    如果在配置中勾选了多套配置,则以pom.xml文件中 profiles中  配置 最后一个配置为准. maven中配置profile节点: <project> .... <profi ...

  2. 访问Harbor报502 Bad Gateway

    Harbor启动都是多个容器的,首先查看一下是否有相关容器未启动 docker ps | grep harbor cae340214e57 goharbor/nginx-photon:v1.9.3 & ...

  3. iOS - 适配iOS 11

    http://www.10tiao.com/html/330/201707/2653579210/1.html 存档 导语:iOS 11 为整个生态系统的 UI 元素带来了一种更加大胆.动态的新风格. ...

  4. 【转载】C#中通过Distinct方法对List集合进行去重

    在C#的List集合对象中,可以使用Distinct方法来对List集合元素进行去重,如果list集合内部元素为值类型,则Distinct方法根据值类型是否相等来判断去重,如果List集合内部元素为引 ...

  5. Vue2.0的核心思想

    Vue的核心思想为数据驱动和组件化. 一.数据驱动——双向绑定 Vue是一种MVVM框架.而DOM是数据的一个种自然映射.传统的模式是通过Ajax请求从model请求数据,然后手动的触发DOM传入数据 ...

  6. ClickHouse学习笔记

    1. 概述 ClickHouse是一个用于联机分析(OLAP:Online Analytical Processing)的列式数据库管理系统(DBMS:Database Management Syst ...

  7. 七分钟理解 Java 的反射 API

    像java一样,一种具有反射功能的语言.允许开发人员在运行时检查类型.方法.字段.注解等,并在程序运行时决定是否使用. 为此,Java的反射API提供类,类,字段,构造函数,方法,注释和其他. 使用它 ...

  8. 关于在centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named '_ctypes'的解决办法

    3.7版本需要一个新的包libffi-devel,安装此包之后再次进行编译安装即可. #yum install libffi-devel -y#make install若在安装前移除了/usr/bin ...

  9. Linux命令——dumpe2fs

    参考:Linux磁盘管理——Ext2文件系统 简介 dumpe2fs用于查询 Ext 家族 superblock以及GDT(Group Descriptor Table,块组描述符表) 信息. 用法 ...

  10. Schema学习【一】

    XML Schema 是基于 XML 的 DTD 替代者. 什么是 XML Schema? XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD. XML Schema: 定义 ...