题意:对于任意输入的正整数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. JS学习-事件响应小结-简单的计算器

    <!DOCTYPE html> <html> <head> <title> 事件</title> <script type=" ...

  2. Android原生系统API自带dp、px、sp单位转换

    Android系统中自带的Api中可以使用TypedValue进行单位转换 1,调用系统api转换单位 // 获得转换后的px值 float pxDimension = TypedValue.appl ...

  3. 用户授权policy

    定义策略类 php artisan make:policy PostPolicy app/Policies/PostPolicy.php public function update(User $us ...

  4. Sql Server 2008R2升级 Sql Server 2012 问题

    环境: Windows server 2008 r2 Standard +SqlServer2008R2  内网环境需要升级为SQL server 2012 升级安装时提示版本不支持 网上查询相关问题 ...

  5. Mysql数据库表的迁移和表的复制

    同一台服务器上的,数据库之间的表的迁移: create table db.tablename as select * from db2.tablename; 此sql使用于mysql,从一台服务器上的 ...

  6. 2019年今日头条机试_JAVA后台岗_第二题

    使用map的递推,java对象做key需要重写equeal,hashCode方法,使拥有相同属性值的对象被识别为同一对象. import java.util.*; class Cat{ public ...

  7. 在Eclipse中通过JDBC连接MySQL步骤,非常详细!

    通过JDBC连接MySQL基本步骤代码讲解步骤可能遇到的Bug基本步骤JDBC访问MySQL 1.加载JDBC驱动器—>哪个project需要,就添加到该project的jdbc文件夹下,我的j ...

  8. BI结构图及自动建表结构图

  9. tmp note

    cat file.txt > /dev/null 2>&1 丢弃错误和标准输出 systemctl isolate multi-user.target 切换回多用户命令行模式 sy ...

  10. SQL Sever中多列拼接成一列值为NULL

    查询出数据 SELECT a.ID AS KYMain_ID , ',' + a.Leader + ',' AS KYMain_Leader , ), b.TaskLeader) FROM TB_KY ...