[HNOI2001]求正整数
题目描述
对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m。
例如:n=4,则m=6,因为6有4个不同整数因子1,2,3,6;而且是最小的有4个因子的整数。
输入输出格式
输入格式:
n(1≤n≤50000)
输出格式:
m
输入输出样例
INT.IN
4
INT.OUT
6
题解:
这道题和[HAOI 2007]反素数ant解题思路和方法简直一毛一样...
同样我们引入这个公式:
对任一整数a>1,有a=p1a1p2a2…pnan,其中p1<p2<…<pn均为素数,而a1,a2…,an是正整数。
a的正约数个数为:(1+a1)(1+a2)…(1+an)
同理,我们也是求有n个因数的最小整数。
我们最坏的情况所有质数只取1个,由于15<log250000<16
由于数字过大,这里用指数形式保存,用于比较大小
同时注意每层循环枚举取质数的个数时候,因为不合法的情况很多,可以只枚举√n次,然后用枚举的值算出对应的另外一个值。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int len,p[],prime[],n,ans[];
double lg[],maxx=2e9;
void print(int x)
{int i,j,k;
long long s[],Mod=1e4;
memset(s,,sizeof(s));
s[]=;len=;
for (i=;i<=x;i++)
{
for (j=;j<=ans[i];j++)
{
for (k=;k<=len;k++)
{
s[k]=s[k]*prime[i];
}
for (k=;k<=len;k++)
s[k+]+=s[k]/Mod,s[k]%=Mod;
while (s[len+]) len++;
}
}
for (i=len;i>=;i--)
if (i!=len)
printf("%04d",s[i]);
else printf("%d",s[i]);
}
void dfs(double s,int x,int k)
{int i;
if (s>=maxx) return;
if (k==)
{
maxx=s;
memcpy(ans,p,sizeof(ans));
return;
}
if (x>) return;
//cout<<p[x-1]<<endl;
for (i=;(i+)*(i+)<=k;i++)
if (k%(i+)==)
{
if (i!=)
{
p[x]=i;
dfs(s+i*lg[x],x+,k/(i+));
p[x]=;
}
if ((i+)*(i+)!=k)
{
p[x]=k/(i+)-;
dfs(s+p[x]*lg[x],x+,i+);
p[x]=;
}
}
}
int main()
{int i;
cin>>n;
prime[]=;prime[]=;prime[]=;prime[]=;prime[]=;
prime[]=;prime[]=;prime[]=;prime[]=;
prime[]=;prime[]=;prime[]=;prime[]=;
prime[]=;prime[]=;prime[]=;
for (i=;i<=;i++)
lg[i]=(double)log(prime[i]);
dfs(,,n);
//for (i=1;i<=16;i++)
//cout<<ans[i]<<endl;
print();
}
[HNOI2001]求正整数的更多相关文章
- 高精度+搜索+质数 BZOJ1225 [HNOI2001] 求正整数
// 高精度+搜索+质数 BZOJ1225 [HNOI2001] 求正整数 // 思路: // http://blog.csdn.net/huzecong/article/details/847868 ...
- BZOJ 1225: [HNOI2001] 求正整数( dfs + 高精度 )
15 < log250000 < 16, 所以不会选超过16个质数, 然后暴力去跑dfs, 高精度计算最后答案.. ------------------------------------ ...
- bzoj1225 [HNOI2001] 求正整数
1225: [HNOI2001] 求正整数 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 762 Solved: 313[Submit][Statu ...
- luogu P1128 [HNOI2001]求正整数 dp 高精度
LINK:求正整数 比较难的高精度. 容易想到贪心不过这个贪心的策略大多都能找到反例. 考虑dp. f[i][j]表示前i个质数此时n的值为j的最小的答案. 利用高精度dp不太现实.就算上FFT也会T ...
- 【BZOJ】1225: [HNOI2001] 求正整数
http://www.lydsy.com/JudgeOnline/problem.php?id=1225 题意:给一个数n,求一个最小的有n个约数的正整数.(n<=50000) #include ...
- BZOJ 1225: [HNOI2001] 求正整数 高精度+搜索+质数
题意:给定n求,有n个因子的最小正整数. 题解:水题,zcr都会,我就不说什么了. 因数个数球求法应该知道,将m分解质因数,然后发现 a1^p1*a2^p2....an^pn这样一个式子, (1+p1 ...
- [HNOI2001] 求正整数 - 背包dp,数论
对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m. Solution (乍一看很简单却搞了好久?我真是太菜了) 根据因子个数计算公式 若 \(m = \prod p_i^{q_i}\) ...
- P1128 [HNOI2001]求正整数
传送门 rqy是我们的红太阳没有它我们就会死 可以考虑dp,设\(dp[i][j]\)表示只包含前\(j\)个质数的数中,因子个数为\(i\)的数的最小值是多少,那么有转移方程 \[f[i][j]=m ...
- 求正整数n所有可能的和式的组合(如;4=1+1+1+1、1+1+2、1+3、2+1+1、2+2
作者:张小二 nyoj90 ,可以使用递归的方式直接计算个数,也可以通过把满足的个数求出来计数,因为在juLy博客上看到整数划分,所以重写了这个代码,就是列出所m的可能性,提交后正确.acmer的入门 ...
随机推荐
- linux,windows,ubuntu下git安装与使用
ubuntu下git安装与使用:首先应该检查本地是否已经安装了git ,如果没有安装的话,在命令模式下输入 sudo apt-get install git 进行安装 输入git命令查看安装状态及常用 ...
- Beta 第六天
今天遇到的困难: github服务器响应很慢 推图的API接口相应较慢,超过了初始设定的最大延迟时间,导致了无法正确返回图片 ListView滑动删除Demo出现了某些Bug,这些Bug可能导致了某些 ...
- day9
Alpha冲刺Day9 一:站立式会议 今日安排: 经过为期5天的冲刺,基本完成企业人员模块的开发.因第三方机构与企业存在委托的关系.第三方人员对于风险的自查.风险列表的展示以及自查风险的统计展示(包 ...
- IDEA之Jrebel插件激活
问题: 码农日常中,热部署是必不可少的,而jrebel插件很好的实现热部署功能. IDEA下载jrebel插件,可以免费试用15天,但之后就无法使用.因为Jrebel是收费的. 解决方法: 楼主也是百 ...
- js实现短暂提示框
业务场景:当鼠标移入某元素时,显示提示框进行介绍.当鼠标移除时,会自动消失.引入ToolTip.js和ToolTip.css 主方法:ToolTip.show(需要提示的元素id, 随意不重复即可, ...
- httpClient 中的post或者get请求
httpClient相对于java自带的请求功能更加强大,下面就以例子的形式给出: //HttpClient Get请求 private static void register() { try { ...
- js 中bind
function fn(a){ this.innerHTML = a; console.log(this); } //fn("hello"); span1.onclick =fun ...
- 安装CentOS7,连接mysql提示密码错误
1.grep 'temporary password' /var/log/mysqld.log 如果上面命令没有查看到密码 2.修改my.cnf文件.在mysqld下加入skip-grant-tabl ...
- Code::Blocks出现64-Bit mode not compled in解决方法
原因是:Settings->compilter你选了Target x86 _64(64bit),选择Target x86 _32(32bit)即可 废了老半天劲才找到原因,希望能让朋友们少走弯路
- VMware-vCenter-Server-Appliance VCSA升级步骤
1.下载ZIP升级文件并解压 2.打开HFS,把解压后的文件夹拖到"Virtual File System"下,在弹出的对话框中点击"Virtual folder&quo ...