【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;
}

最新文章

  1. 第11章 Java异常与异常处理
  2. 【iCore3 双核心板】例程三十四:U_DISK_IAP_ARM实验——更新升级STM32
  3. 关于silverlight打印模糊的问题
  4. UITextView限制字数与行数
  5. js String方法集合
  6. Objective-C设计模式——工厂方法模式virtual constructor(对象创建)
  7. Awesome (and Free) Data Science Books[转]
  8. Aizu 2302 On or Off dfs/贪心
  9. query 防止ajax重复提交
  10. WORD 无格式粘贴 2003 2007 MacOS2011
  11. 警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的陷阱
  12. 计算机图形学(第2版 于万波 于硕 编著)第45页的Bresenham算法有错误
  13. python使用mysql
  14. 第一行代码 -3-1 软件也要拼脸蛋-UI界面
  15. jQuery的ajaxFileUpload上传插件——刷新一次才能再次调用触发change
  16. iOS项目之报错笔记
  17. MyBatis逆向工程:根据table生成Model、Mapper、Mapper.xml
  18. bzoj2014
  19. day07(Set接口,HashSet类,hashcoad(),Collections工具类,Map集合)
  20. 项目Beta冲刺(团队)第五天

热门文章

  1. 「Shimo使用指南」mac支持pptp协议的小软件
  2. 深入浅出xpath轴定位
  3. 一天两道pat(3)1007,1008
  4. [考试反思]1110csp-s模拟测试109:细节
  5. IDEA生成可执行的jar文件
  6. Charles 使用笔记
  7. pandas.apply()函数
  8. spark log4j 日志配置
  9. C# calculate disk size
  10. Selenium(十五):unittest单元测试框架(一) 初识unittest