[HNOI 2001]求正整数
Description
对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m。例如:n=4,则m=6,因为6有4个不同整数因子1,2,3,6;而且是最小的有4个因子的整数。
Input
n(1≤n≤50000)
Output
m
Sample Input
Sample Output
6
题解
这道题和[HAOI 2007]反素数ant解题思路和方法简直一毛一样...
同样我们引入这个公式:
对任一整数$a>1$,有$a={p_1}^{a_1}{p_2}^{a_2}…{p_n}^{a_n}$,其中$p_1<p_2<…<p_n$均为素数,而$a_1$,$a_2$…,$a_n$是正整数。
$a$的正约数个数为:$(1+a_1)(1+a_2)…(1+a_n)$
同理,我们也是求有$n$个因数的最小整数。
我们最坏的情况所有质数只取$1$个,由于$15<log_{2}50000<16$
所以只要取前$16$个质数即可,
其余都和之前那题一样...
搜的时候为了保存最优值,因为数据大会爆$long$ $long$我们考虑用指数幂的形式保存,带一个数组保存取质数的个数。
同时注意每层循环枚举取质数的个数时候,因为不合法的情况很多,可以只枚举$\sqrt n$次,然后用枚举的值算出对应的另外一个值。
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const double INF=1e100;
const int pri[]={,,,,,,,,,,,,,,,,}; int n;
double lg[],mm=INF;
int ans[],tmp[]; void Dfs(double e,int y,int cen)
{
if (e>=mm) return;
if (y==)
{
mm=e;
memcpy(ans,tmp,sizeof(ans));
return;
}
if (cen>) return;
for (int i=;(i+)*(i+)<=y;i++) if (!(y%(i+)))
{
if (i!=)
{
tmp[cen]=i;
Dfs(e+lg[cen]*i,y/(i+),cen+);
tmp[cen]=;
}
if ((i+)*(i+)!=y)
{
tmp[cen]=y/(i+)-;
Dfs(e+lg[cen]*(y/(i+)-),i+,cen+);
tmp[cen]=;
}
}
}
void print()
{
const int MOD=1e4;
int a[],maxn=;
a[]=;
for (int i=;i<=;i++)
{
for (int j=;j<=ans[i];j++)
{
for (int k=;k<=maxn;k++) a[k]*=pri[i];
for (int k=;k<=maxn;k++) a[k+]+=a[k]/MOD,a[k]%=MOD;
if (a[maxn+]) maxn++;
}
}
printf("%d",a[maxn]);
for (int i=maxn-;i>=;i--) printf("%04d",a[i]);
printf("\n");
} int main()
{
scanf("%d",&n);
for (int i=;i<=;i++) lg[i]=log(pri[i]);
Dfs(,n,);
print();
return ;
}
[HNOI 2001]求正整数的更多相关文章
- 高精度+搜索+质数 BZOJ1225 [HNOI2001] 求正整数
// 高精度+搜索+质数 BZOJ1225 [HNOI2001] 求正整数 // 思路: // http://blog.csdn.net/huzecong/article/details/847868 ...
- 求正整数n所有可能的和式的组合(如;4=1+1+1+1、1+1+2、1+3、2+1+1、2+2
作者:张小二 nyoj90 ,可以使用递归的方式直接计算个数,也可以通过把满足的个数求出来计数,因为在juLy博客上看到整数划分,所以重写了这个代码,就是列出所m的可能性,提交后正确.acmer的入门 ...
- BZOJ 1225: [HNOI2001] 求正整数( dfs + 高精度 )
15 < log250000 < 16, 所以不会选超过16个质数, 然后暴力去跑dfs, 高精度计算最后答案.. ------------------------------------ ...
- 实验一:实现求正整数1-N之间所有质数的功能,并进行测试。
实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 命令行下的程序开 ...
- 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 ...
- 求正整数2和n之间的完全数
[题目描述] 求正整数22和nn之间的完全数(一行一个数). 完全数:因子之和等于它本身的自然数,如6=1+2+36=1+2+3 [输入] 输入n(n≤5000)n(n≤5000). [输出] 一行一 ...
- 【BZOJ】1225: [HNOI2001] 求正整数
http://www.lydsy.com/JudgeOnline/problem.php?id=1225 题意:给一个数n,求一个最小的有n个约数的正整数.(n<=50000) #include ...
- BZOJ-1225-[HNOI2001] 求正整数
Description 对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m.例如:n=4,则m=6,因为6有4个不同整数因子1,2,3,6:而且是最小的有4个因子的整数. Input n ...
随机推荐
- Leetcode 1——twosum
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- g第十四周,十五周作业
1.数组中偶数的和 #include <stdio.h> int main(){ ; ]; ;i<=;i++) { scanf("%d ",&a[i]); ...
- Beta Scrum
听说 Beta Scrum Day 1
- 操作 numpy 数组的常用函数
操作 numpy 数组的常用函数 where 使用 where 函数能将索引掩码转换成索引位置: indices = where(mask) indices => (array([11, 12, ...
- Linux下vim上编辑实现进度条
1.效果展示: 进度条,先来看一个效果: 这是进度结果,模拟实现了进度条的前进.百分比的现实.以及稍微的动画特效. 2.原理描述: 因为Linux系统下的输出有缓存,如果及时刷新显示,就可以得到我们想 ...
- iOS中CocoaPods的安装及错误详解
什么是CocoaPods CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们可以为项目添加被称为"Pods"的依赖库(这些类库必须是Coc ...
- 201421123042 《Java程序设计》第12周
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...
- "一不小心就火了"团队采访
团队采访 一. 采访团队 团队:一不小心就火了 采访形式:线上问答 二.采访内容 你们是怎么合理地具体分配组员里的工作的?有些团队会出现个别组员代码任务很重,个别组员无所事事的情况,你们有什么有效的方 ...
- js 从一个函数中传递值到另一个函数
一个函数的调用大家都会用 我今天在调接口的时候突然发现需要引用个另一个函数中拿到的值 举个栗子 刚开始 我是这样调用的 alert弹出的是 hello world . 但是我a函数内部还有一个函数 画 ...
- Mybatis的mapper代理开发dao方法
看完了之前的mybatis原始的dao开发方法是不是觉得有点笨重,甚至说没有发挥mybatis 作为一个框架的优势.总结了一下,原始的dao方法有以下几点不足之处 dao接口实现方法中存在大量的模板方 ...