题意:对于任意输入的正整数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. htm 中 <b>和<strong>的区别

    显示上两者没有任何区别,都是粗体<b>:为了加粗而加粗,推荐使用 css font-weight 属性来创建粗体文字.<strong>:为了强调而加粗,表示十分重要.在网页中使 ...

  2. 【学习笔记】深入理解js原型和闭包(7)——原型的灵活性

    在Java和C#中,你可以简单的理解class是一个模子,对象就是被这个模子压出来的一批一批月饼(中秋节刚过完).压个啥样,就得是个啥样,不能随便动,动一动就坏了. 而在javascript中,就没有 ...

  3. WARN警告:Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended

    使用Apache HttpClient发送请求,有大量WARN警告:Going to buffer response body of large or unknown size. Using getR ...

  4. Git理论知识补充

    转自: http://www.cnblogs.com/hnrainll/archive/2012/11/13/2768003.html 对于任何一个文件,在 Git 内都只有三种状态:已提交(comm ...

  5. 什么是Entitlement

    Entitlement(权限),可以想象成App里用于描述该App可以调用哪些服务的字符串.苹果的操作系统(mac os或者iOS)会通过检查这个串,决定这个应用是否可以调用相关功能.比如iCloud ...

  6. fgetpos, fseek, fsetpos, ftell, rewind - 重定位某个流

    总览 (SYNOPSIS) #include <stdio.h> int fseek(FILE *stream, long offset, int whence); long ftell( ...

  7. final关键字所修饰的类有什么特点

    Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的方法默认是final的. final方法 ...

  8. vs2010的资源视图中,对话框显示数字的解决方法之一

    以上是不正常显示. 我这次遇到该问题的原因是资源名IDD_DLG_INTENSITY重复定义导致的, 所以在resource.h文件中去除重复定义就好了. 正常应该显示DD_XXX,如下图所示

  9. Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/config/spring/applicationContext.xml]

    在搭建SpringMVC框架的时候遇到了这个问题 问题的原因: 就是没有找到applicatoincontext.xml这个文件, 因为idea自动生成的路径不正确 因此需要再web.xml里面, ( ...

  10. Fiddler设置显式IP地址

    打开Fiddler, 菜单栏:Rules->Customize Rules… 或快捷键 Ctrl+R . 通过快捷键 Ctrl+F ,搜索:static function Main() 函数. ...