【HDU6037】Expectation Division(动态规划,搜索)

题面

Vjudge

你有一个数\(n\),\(n\le 10^{24}\),为了方便会告诉你\(n\)分解之后有\(m\)个不同的质因子,并且把这些质因子给你。

你每次可以把\(n\)变成一个它的约数,求变成\(1\)的期望步数。

题解

首先暴力的转移是:

\[f[n]=1+\frac{1}{\sigma(n)}\sum_{d|n}f[d]
\]

不难发现这个状态之和每个质因子的出现次数的集合相关,与质因子是什么无关。

发现\(n\)本质不同的质因子最多只有\(18\)个,那么我们爆搜这个每个质因子出现次数的集合,强制较小的质因子出现次数较大,搜完之后发现状态只有\(172513\)个。

于是我们对于每个\(n\)的质因子出现个数的集合计算答案,只需要求解一个高维前缀和就可以进行转移了。

这里高维前缀和的求法,设\(g[n][j]\)表示对于\(n\)这个数(这个数是爆搜出来的,也就是满足小的质因子的出现次数不会少于大的质因子的出现次数),其前\(j\)个质因子的出现次数都相同,但是\(j\)之后的质因子出现次数小于等于当前位置的所有\(f[n]\)的和,转移的时候枚举给哪一位减一就行了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
#define ll __int128
#define MAX 200200
const ll Limit=(ll)1e12*(ll)1e12;
ll n;int m,Case;
char ch[30];int a[30];
int p[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73};
map<ll,int> M;int tot;ll val[MAX];
double g[MAX][20],f[MAX];
void dfs(int x,int lst,ll s)
{
val[M[s]=++tot]=s;s*=p[x];
for(int i=1;i<=lst&&s<=Limit;++i,s*=p[x])dfs(x+1,i,s);
}
int main()
{
dfs(0,90,1);
for(int i=2;i<=tot;++i)
{
ll x=val[i];for(int j=0;j<18;++j)a[j]=0;
for(int j=0;j<18;++j)while(x%p[j]==0)++a[j],x/=p[j];
for(int j=17;~j;--j)
if(a[j])
{
int k=j;while(k<17&&a[k+1]==a[j])++k;
g[i][j]=g[i][j+1]+g[M[val[i]/p[k]]][j];
}
int tmp=1;
for(int j=0;j<18;++j)tmp*=a[j]+1;
f[i]=(g[i][0]+tmp)/(tmp-1);
for(int j=0;j<18;++j)g[i][j]+=f[i];
}
while(scanf("%s",ch+1)!=EOF)
{
for(int i=1,l=strlen(ch+1);i<=l;++i)n=n*10+ch[i]-48;
scanf("%d",&m);
for(int i=0;i<m;++i)
{
int p;scanf("%d",&p);a[i]=0;
while(n%p==0)n/=p,++a[i];
}
sort(&a[0],&a[m]);reverse(&a[0],&a[m]);
for(int i=0;i<m;++i)
for(int j=1;j<=a[i];++j)
n*=p[i];
printf("Case #%d: %.10lf\n",++Case,f[M[n]]);
for(int i=0;i<m;++i)a[i]=0;n=0;
}
return 0;
}

【HDU6037】Expectation Division(动态规划,搜索)的更多相关文章

  1. HDU6037 Expectation Division 期望、高维前缀和

    传送门 设\(f_x\)表示答案,那么\(f_x = \frac{\sum\limits_{d \mid x} f_d}{\sigma_0(x)} + 1 = \frac{\sigma_0(x) + ...

  2. 【BZOJ4421】[Cerc2015] Digit Division 动态规划

    [BZOJ4421][Cerc2015] Digit Division Description 给出一个数字串,现将其分成一个或多个子串,要求分出来的每个子串能Mod M等于0. 将方案数(mod 1 ...

  3. [AH2017/HNOI2017]大佬(动态规划 搜索)

    /* 神仙yyb 理解题意可以发现 能够对大佬造成的伤害只和你怼了多少天大佬有关, 而且显然天数越多越好 那么我们可以先通过预处理来找出我们最多能够怼多少天大佬 然后我们发现最后我们能怼的血量状态数是 ...

  4. HDU 题目分类

    转载自新浪博客,, http://blog.sina.com.cn/s/blog_71ded6bf0100tuya.html 基础题: 1000.1001.1004.1005.1008.1012.10 ...

  5. N.O.W,O.R,N.E.V.E.R--12days to LNOI2015

    双向链表 单调队列,双端队列 单调栈 堆 带权并查集 hash 表 双hash 树状数组 线段树合并 平衡树 Treap 随机平衡二叉树 Scapegoat Tree 替罪羊树 朝鲜树 块状数组,块状 ...

  6. NOIP考点

    NOIP考点 基础算法 图 树 数论 数据结构 动态规划 搜索 其他算法 省选知识点汇总 图论 数据结构 字符串相关算法及数据结构 数学 计算几何 搜索 动态规划 其他算法 转自:巨佬的博客 加*号是 ...

  7. NOIP 2010

    tags: NOIP 并查集 动态规划 搜索 categories: 信息学竞赛 总结 机器翻译 乌龟棋 关押罪犯 引水入城 机器翻译 Solution 维护一个队列, 每次从词典中查词时将单词加入队 ...

  8. HDU 多校1.5

    Expectation Division Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/O ...

  9. codevs与noi做题改错本目录

    从2016.2.13开始: 1.  排序超时的问题---------目录:-测试习题 2.  超高精度乘法超时问题-----------目录:高精度计算 算法:快速傅里叶算法. 压位算法 3. 高精度 ...

随机推荐

  1. [CodeForces-1225A] Forgetting Things 【构造】

    [CodeForces-1225A] Forgetting Things [构造] 标签: 题解 codeforces题解 构造 题目描述 Time limit 2000 ms Memory limi ...

  2. js获取数组最大值或最小值

    数组对象arr中属性num最大值最小值 // 最大值 Math.max.apply(Math,arr.map(item => { return item.num })) arr.sort((a, ...

  3. go语言变量作用域

    Go 语言变量作用域 作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围. Go 语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变量称为全局变量 函 ...

  4. 基于 Swoole 的微信扫码登录

    随着微信的普及,扫码登录方式越来越被现在的应用所使用.它因为不用去记住密码,只要有微信号即可方便快捷登录.微信的开放平台原生就有支持扫码登录的功能,不过大部分人还是在用公众平台,所以扫码登录只能自行实 ...

  5. Django之web框架原理

    Web框架原理 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 先写一个 原始的web框架 imp ...

  6. Windows7中启动Mysql服务时提示:拒绝访问的一种解决方式

    场景 在Windows7中打开任务管理器--服务下 找到mysql的服务点击启动时提示: 拒绝访问 这是因为权限不够导致的不能启动sql服务. 点击 任务管理器右下角的服务 在这里就可以正常启动服务

  7. 解决npm下载慢的问题

    方法一:使用淘宝定制的cnpm命令行工具替代默认安装npm npm install -g cnpm --registry=https://registry.npm.taobao.org 方法二:将np ...

  8. Android8.1 开关VOLTE流程分析

    前言 最近有需求需要实现插卡默认打开Volte功能,顺带研究了下Volte的流程,在此做个记录 开始 从Settings设置界面入手,网络和互联网-->移动网络-->VoLTE高清通话(电 ...

  9. 微信小程序实现点击拍照长按录像功能

    微信小程序实现点击拍照长按录像功能 代码里面注释写的都很详细,直接上代码.官方的组件属性中有触摸开始和触摸结束属性.本功能依靠这些属性实现. .wxml代码: <!-- 相机 pages/cam ...

  10. R语言入门1:安装R和RStudio

    R语言入门1:安装R和RStudio 曹务强 中科院遗传学博士研究生 9 人赞同了该文章 1. Windows安装R 在Windows系统上,安装R语言比较简单,直接从R的官方网站下载,按照正常的软件 ...