luogu P1128 [HNOI2001]求正整数 dp 高精度
LINK:求正整数
比较难的高精度。
容易想到贪心不过这个贪心的策略大多都能找到反例。
考虑dp.
f[i][j]表示前i个质数此时n的值为j的最小的答案。
利用高精度dp不太现实。就算上FFT也会T掉。
乘积的形式 我们可以将其变成对数的形式就很容易转移了。
转移时记录决策 然后 最后做一遍高精度即可。
值得一提的是 压位高精度时比如压15为那么最后输出的形式为printf("%015d",ans);
因为%1e15之后有效数位还有15个而并非14个.
const int MAXN=510,N=17;
int n,m,top;
db c[N];
db f[N][MAXN];
int g[N][MAXN],v[MAXN];
int a[N]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
int w[MAXN];
int ans[MAXN*10],len;
inline void get_path(int i,int j)
{
int las=g[i][j];
int ww=v[las]/v[j];
w[i]=ww-1;
if(i)get_path(i-1,las);
}
int main()
{
//freopen("1.in","r",stdin);
//freopen("2.out","w",stdout);
get(n);m=16;if(n==1){puts("1");return 0;}
rep(1,m,i)c[i]=log(a[i]*1.0);
rep(1,n,i)if(n%i==0)v[++top]=i;
rep(0,m,i)rep(1,top,j)f[i][j]=INF;
f[0][top]=0;
rep(0,m-1,i)
{
//if(i==m-1)cout<<"ww"<<endl;
rep(1,top,j)
{
//cout<<f[i][j]<<endl;
//if(i==m-1&&j==top)cout<<"ww"<<' '<<f[m-1][j]<<endl;
if(fabs(f[i][j]-INF)<=EPS)continue;
for(int k=1;k<=j;++k)
{
if(v[j]%v[k]==0)
{
int w=v[j]/v[k];
//if(i==m-1&&j==top&&k==1)
//cout<<' '<<f[i+1][k]<<' '<<f[i+1][k]-f[i][j]-c[i+1]*(w-1)<<endl;
if(f[i+1][k]-f[i][j]-c[i+1]*(w-1)>EPS)
{
f[i+1][k]=f[i][j]+c[i+1]*(w-1);
//if(i+1==m)cout<<f[i+1][k]<<endl;
g[i+1][k]=j;
}
}
}
}
}
//cout<<f[2][1]<<' '<<f[3][1]<<f[1][1]<<endl;
get_path(m,1);
//rep(1,m,i)put(w[i]);
//w[1]=100;w[3]=100;
ans[len=0]=1;
rep(1,m,i)
{
while(w[i])
{
rep(0,len,j)ans[j]=ans[j]*a[i];
rep(0,len,j)ans[j+1]+=ans[j]/mod,ans[j]%=mod;
if(ans[len+1])++len;--w[i];
}
}
printf("%d",ans[len]);
fep(len-1,0,i)printf("%06d",ans[i]);
return 0;
}
luogu P1128 [HNOI2001]求正整数 dp 高精度的更多相关文章
- BZOJ 1225: [HNOI2001] 求正整数( dfs + 高精度 )
15 < log250000 < 16, 所以不会选超过16个质数, 然后暴力去跑dfs, 高精度计算最后答案.. ------------------------------------ ...
- P1128 [HNOI2001]求正整数
传送门 rqy是我们的红太阳没有它我们就会死 可以考虑dp,设\(dp[i][j]\)表示只包含前\(j\)个质数的数中,因子个数为\(i\)的数的最小值是多少,那么有转移方程 \[f[i][j]=m ...
- 高精度+搜索+质数 BZOJ1225 [HNOI2001] 求正整数
// 高精度+搜索+质数 BZOJ1225 [HNOI2001] 求正整数 // 思路: // http://blog.csdn.net/huzecong/article/details/847868 ...
- bzoj1225 [HNOI2001] 求正整数
1225: [HNOI2001] 求正整数 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 762 Solved: 313[Submit][Statu ...
- [HNOI2001] 求正整数 - 背包dp,数论
对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m. Solution (乍一看很简单却搞了好久?我真是太菜了) 根据因子个数计算公式 若 \(m = \prod p_i^{q_i}\) ...
- BZOJ 1225: [HNOI2001] 求正整数 高精度+搜索+质数
题意:给定n求,有n个因子的最小正整数. 题解:水题,zcr都会,我就不说什么了. 因数个数球求法应该知道,将m分解质因数,然后发现 a1^p1*a2^p2....an^pn这样一个式子, (1+p1 ...
- 【BZOJ】1225: [HNOI2001] 求正整数
http://www.lydsy.com/JudgeOnline/problem.php?id=1225 题意:给一个数n,求一个最小的有n个约数的正整数.(n<=50000) #include ...
- [HNOI2001]求正整数
题目描述 对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m. 例如:n=4,则m=6,因为6有4个不同整数因子1,2,3,6:而且是最小的有4个因子的整数. 输入输出格式 输入格式: ...
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
随机推荐
- Mac OS下安装mysqlclient遇到的一些坑
在玩django的同时,必须需要mysqlclient和pillow包,想在本地Mac上装上mysqlclient,但着实遇到不少坑,最终还是在github issue中找到了解决方法,这里记录一下, ...
- 12.Clear Flags属性与天空盒
选中Hierarchy面板的摄像机,然后在右侧Inspector面板的Clear Flags属性可以找到有如下选项, SkyBox:天空盒(默认效果,让场景看着有一个天空) Solid Color:固 ...
- android手机的微信H5弹出的软键盘挡住了文本框,如何解决?
window.addEventListener("resize", function () { if (document.activeElement.tagName == &quo ...
- Navigation Nightmare POJ - 1984
Navigation Nightmare Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usual ...
- 前端06 /JavaScript之BOM、DOM
前端06 /JavaScript 目录 前端06 /JavaScript 昨日内容回顾 js的引入 js的编程要求 变量 输入输出 基础数据类型 number string boolean null ...
- 命令模式(c++实现)
命令模式 目录 命令模式 模式定义 模式动机 UML类图 源码实现 优点 缺点 模式定义 命令模式(Facade),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请 ...
- 手写简易SpringMVC
手写简易SpringMVC 手写系列框架代码基于普通Maven构建,因此在手写SpringMVC的过程中,需要手动的集成Tomcat容器 必备知识: Servlet相关理解和使用,Maven,Java ...
- 小书MybatisPlus第5篇-Active Record模式精讲
本文为一个系列中的第五节,前四节访问如下地址: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总结 小书Mybatis ...
- Ordinary - 官方原版软件下载站
官网:http://a-1.vip/exe/
- canvas学习01
canvas 必须指定宽高,确定可绘图区域的大小 canvas标签里写的是浏览器不支持canvas时展示的内容 <canvas id="drawing" width=&quo ...