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 [ ...
随机推荐
- PTP时钟和NTP时钟同步有什么区别
PTP时钟 理论上任何PTP时钟都能实现主时钟和从时钟的功能,但一个PTP通信子网内只能有一个主时钟.整个系统中的最优时钟为最高级时钟GMC(Grandmaster Clock),有着最好的稳定性.精 ...
- 通过源码学习@functools.lru_cache
一.前言 通常在一些代码中包含了重复运算,而这些重复运算会大大增加代码运行所耗费的时间,比如使用递归实现斐波那契数列. 举个例子,当求 fibonacci(5) 时,需要求得 fibonacci(3) ...
- java 基本语法(三) 运算符
1-算术运算符 1.算术运算符: + - + - * / % (前)++ (后)++ (前)-- (后)-- + [典型代码] //除号:/ int num1 = 12; int num2 = 5; ...
- day1 python计算器底层运作,注释及变量
每日一记 utf-8 国际标准编码(可变长的unicode编码)中文3字节,英文数字特殊字符1字节 gbk 中国标准编码 中文2字节,英文数字特殊字符1字节 1.原码,反码,补码 "&quo ...
- ffmpeg播放器实现详解 - 视频显示
ffplay是ffmpeg源码中一个自带的开源播放器实例,同时支持本地视频文件的播放以及在线流媒体播放,功能非常强大. FFplay: FFplay is a very simple and port ...
- python监控服务器应用日志,推送钉钉机器人,实时关注日志异常
生产环境多台服务器上部署了多个应用,日志出现报错时,无法及时反馈到开发人员.部署一个大型的运维监控应用,不但耗资源,而且配置也不简单. 简简单单写个python脚本来监控服务器日志就简单多了,废话不多 ...
- python怎么自学?今日头条技术大佬的真实经历分享
大家好,我是武州,27岁,目前在字节跳动担任Python后端工程师一职. (摆拍一下,假装是保安) 在开始今天的文章之前,不知道你们有没有遇到过这样的问题: 大学没学到什么实质技术,毕业后找不到高薪的 ...
- 中介者模式(c++实现)
中介者模式 目录 中介者模式 模式定义 模式动机 UML类图 源码实现 优点 缺点 模式定义 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用, ...
- PyQt5多线程和定时器
多线程 一般情况单线程就可以很好的完成任务,但是对于GUI程序来说,单线程就不能完全满足需求.如果有耗时流程,在单线程的情况下,界面操作就会卡死,直到耗时操作完成,才会响应界面操作.为了解决这个问题, ...
- [jvm] -- 内存模型篇
内存模型 JDK1.6 JDK1.8 线程私有的: 程序计数器 虚拟机栈 本地方法栈 线程共享的: 堆 方法区 直接内存 (非运行时数据区的一部分) 程序计数器 线程私有 两个作用 字节码解释器通 ...