题意:对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m。

n<=50000

思路:记得以前好像看的是maigo的题解

n即为将m分解为质数幂次的乘积后的次数+1之积

经检验只需要取前16个质数

其次幂次的数据单调不增

乘积大小比较时候表示为ln之和,这样比较巧妙的避开了大整数比较

加了这几个优化跑的飞快

注意需要加高精

C++

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<map>
#include<set>
#include<cmath>
int prime[]={,,,,,,,,,,,,,,,,};
int a[],b[],c[],d[],ans[],s[];
double f[];
int n,ansp;
double anse; void dfs(int n,int p,int limit,double e)
{
if(n==)
{
if(e<anse)
{
for(int i=;i<=;i++) ans[i]=s[i];
anse=e;
ansp=p;
}
exit;
}
for(int i=;i<=limit;i++)
if(!(n%(i+)))
{
s[p]=i;
dfs(n/(i+),p+,i,e+f[p]*i);
}
} void mult1(int *a,int *b,int *c)
{
for(int i=;i<=c[];i++) c[i]=;
c[]=;
for(int i=;i<=a[];i++)
for(int j=;j<=b[];j++)
{
int k=i+j-;
c[k]+=a[i]*b[j];
c[k+]+=c[k]/;
c[k]%=;
}
c[]=a[]+b[];
if(!c[c[]]) c[]--;
} void mult2(int *a,int b)
{ for(int i=;i<=a[];i++) a[i]*=b;
for(int i=;i<=a[]-;i++)
{
a[i+]+=a[i]/;
a[i]%=;
}
while(a[a[]]>)
{
a[a[]+]=a[a[]]/;
a[a[]]%=;
a[]++;
}
} void pow(int *x,int *y,int k,int p)
{
if(k==)
{
for(int i=;i<=x[];i++) x[i]=;
x[]=;
if(prime[p]<)
{
x[]=; x[]=prime[p];
}
else
{
x[]=; x[]=prime[p]/; x[]=prime[p]%;
}
}
else
{
pow(y,x,k>>,p);
mult1(y,y,x);
if(k&) mult2(x,prime[p]);
} } void print(int *a)
{
for(int i=a[];i>;i--) printf("%d",a[i]);
printf("\n");
} int main()
{
freopen("bzoj1225.in","r",stdin);
freopen("bzoj1225.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=;i++) f[i]=log(prime[i]);
anse=3e38;
dfs(n,,n-,);
ansp--;
a[]=; a[]=;
for(int i=;i<=ansp;i++)
{
pow(c,d,ans[i],i);
if(i&) mult1(a,c,b);
else mult1(b,c,a);
}
if(ansp&) print(b);
else print(a);
}

pascal

 type arr=array[-..]of longint;
const base=;
prime:array[..]of longint=(,,,,,,,,,
,,,,,,); var s,ans:array[..]of longint;
n,ansp:longint;
anse:real;
a,b,c,d:arr;
bool:boolean; procedure dfs(n,p,limit:longint;e:real);
var i:longint;
begin
if n= then
begin
if e<anse then begin ans:=s; anse:=e; ansp:=p; end;
exit;
end;
for i:= to limit do
if n mod (i+)= then
begin
s[p]:=i;
dfs(n div (i+),p+,i,e+ln(prime[p])*i);
end;
end; procedure lyk(var a:arr;b:longint);
var i:longint;
begin
for i:= to a[-] do a[i]:=a[i]*b;
for i:= to a[-] do
begin
inc(a[i+],a[i] div base);
a[i]:=a[i] mod base;
end;
if a[a[-]+]> then inc(a[-]);
end; procedure zhw(var a,b,c:arr);
var i,j,k:longint;
begin
fillchar(c,sizeof(c),);
for i:= to a[-] do
for j:= to b[-] do
begin
k:=i+j;
inc(c[k],a[i]*b[j]);
inc(c[k+],c[k] div base);
c[k]:=c[k] mod base;
end;
c[-]:=a[-]+b[-];
if c[c[-]+]> then inc(c[-]);
end; procedure pow(var x,y:arr;p:longint);
begin
if p= then
begin
fillchar(x,sizeof(x),);
x[]:=prime[n];
end
else
begin
pow(y,x,p>>);
zhw(y,y,x);
if p and = then lyk(x,prime[n]);
end;
end;
procedure print(var a:arr);
var i:longint;
begin
write(a[a[-]]);
for i:=a[-]- downto do
write(a[i] div ,a[i] div mod ,a[i] div mod ,a[i] mod );
writeln;
end; begin readln(n);
anse:=3e38;
dfs(n,,n-,);
dec(ansp);
fillchar(a,sizeof(a),);
a[]:=;
for n:= to ansp do
begin
pow(c,d,ans[n]);
if n and = then zhw(a,c,b)
else zhw(b,c,a);
end; if ansp and = then print(b)
else print(a); end.

【BZOJ1225】求正整数(数论)的更多相关文章

  1. 高精度+搜索+质数 BZOJ1225 [HNOI2001] 求正整数

    // 高精度+搜索+质数 BZOJ1225 [HNOI2001] 求正整数 // 思路: // http://blog.csdn.net/huzecong/article/details/847868 ...

  2. bzoj1225 [HNOI2001] 求正整数

    1225: [HNOI2001] 求正整数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 762  Solved: 313[Submit][Statu ...

  3. 求正整数n所有可能的和式的组合(如;4=1+1+1+1、1+1+2、1+3、2+1+1、2+2

    作者:张小二 nyoj90 ,可以使用递归的方式直接计算个数,也可以通过把满足的个数求出来计数,因为在juLy博客上看到整数划分,所以重写了这个代码,就是列出所m的可能性,提交后正确.acmer的入门 ...

  4. BZOJ 1225: [HNOI2001] 求正整数( dfs + 高精度 )

    15 < log250000 < 16, 所以不会选超过16个质数, 然后暴力去跑dfs, 高精度计算最后答案.. ------------------------------------ ...

  5. 实验一:实现求正整数1-N之间所有质数的功能,并进行测试。

    实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 命令行下的程序开 ...

  6. luogu P1128 [HNOI2001]求正整数 dp 高精度

    LINK:求正整数 比较难的高精度. 容易想到贪心不过这个贪心的策略大多都能找到反例. 考虑dp. f[i][j]表示前i个质数此时n的值为j的最小的答案. 利用高精度dp不太现实.就算上FFT也会T ...

  7. 求正整数2和n之间的完全数

    [题目描述] 求正整数22和nn之间的完全数(一行一个数). 完全数:因子之和等于它本身的自然数,如6=1+2+36=1+2+3 [输入] 输入n(n≤5000)n(n≤5000). [输出] 一行一 ...

  8. [HNOI2001] 求正整数 - 背包dp,数论

    对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m. Solution (乍一看很简单却搞了好久?我真是太菜了) 根据因子个数计算公式 若 \(m = \prod p_i^{q_i}\) ...

  9. 【BZOJ】1225: [HNOI2001] 求正整数

    http://www.lydsy.com/JudgeOnline/problem.php?id=1225 题意:给一个数n,求一个最小的有n个约数的正整数.(n<=50000) #include ...

随机推荐

  1. Spring-bean(一)

    配置形式:基于xml文件的方式:基于注解的方式 Bean的配置方式:通过全类名(反射),通过工厂方法(静态工厂方法&实例工厂方法),FactoryBean 依赖注入的方式:属性注入,构造器注入 ...

  2. T4308 数据结构判断

    https://www.luogu.org/record/show?rid=2143639 题目描述 在世界的东边,有三瓶雪碧. ——laekov 黎大爷为了虐 zhx,给 zhx 出了这样一道题.黎 ...

  3. 《Python基础教程》 读书笔记 第六章 抽象 函数 参数

    6.1创建函数 函数是可以调用(可能包含参数,也就是放在圆括号中的值),它执行某种行为并且返回一个值.一般来说,内建的callable函数可以用来判断函数是否可调用: >>> x=1 ...

  4. (译)IOS block编程指南 2 block开始

    Getting Started with Blocks(开始block) The following sections help you to get started with blocks usin ...

  5. 《少年先疯队》第九次团队作业:Beta冲刺第三天

    3.1 今日完成任务情况 姚玉婷:酒店系统中剩余功能的完善 马丽莎:酒店系统中管理员功能的测试 张   琼:酒店系统中会员功能的测试 孙苗坤:酒店系统中其余管理功能的测试文档的编写 3.2 成员贡献时 ...

  6. G7或变G6+1?特朗普七国峰会箱友军开炮

    今日导读 G7 峰会刚召开完毕,德国总理默克尔发的一张照片就迅速火遍全球.照片中她身体前倾,像是在质问特朗普,而后者则双手交叉胸前,我自岿然不动,这张火药味十足的照片不禁让人脑补当时剑拔弩张的气氛.到 ...

  7. 手工修改注册表激活windows xp法

    手工修改注册表激活windows xp法: 1.安装原版windows xp 2.打开注册表regedit 3.找到主键 Hkey_Local_Machine\Software\Microsoft\W ...

  8. VC无窗口控制台程序

    VC无窗口控制台程序 #pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartu ...

  9. 【搜索】P1468 派对灯 Party Lamps

    P1468 派对灯 Party Lamps 我们来分析一下对灯的操作 1.对所有灯的,这时吧所有灯看成一个整体 2.奇偶数的操作,这时可以把每两个数看成一个循环节 3.对3X+ 1的操作,这时可以把每 ...

  10. [BZOJ3940]:[Usaco2015 Feb]Censoring(AC自动机)

    题目传送门 题目描述: FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过105的字符串S.他有一个包含n个单词的列表,列表里的n个单词记为t1…tN.他希望从S中删除这些单词.FJ每次在S中 ...