题意:对于任意输入的正整数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. Java入门小知识

    软件开发什么是软件?  一系列按照特定顺序组织的计算机数据和指令的集合什么是开发?  制作软件 人机交互  软件的出现实现了人与计算机之间的更好的交互交互方式   图形化界面:这种方式简单直观,使用者 ...

  2. C# 获取本机IP(优化项目实际使用版)

    好一段时间没来更新博客了,因为密码实在记不住,烦死了,密码干脆直接用那个找回密码链接的一部分. 吐槽完说正事了,关于C#  获取本机IP的,最开始用的是下面的,但是因为获取IP的有点多,而且难判断,忽 ...

  3. swift版本拼图游戏项目源码

    现学现做的第一个swift版本拼图游戏demo 常规模式,对换模式任你选择, 用到了花瓣的API,各种萌妹子~

  4. MYSQL 二次筛选,统计,最大值,最小值,分组,靠拢

    HAVING 筛选后再 筛选 SELECT CLASS,SUM(TOTAL_SCORES) FROM student_score GROUP BY CLASS HAVING SUM(TOTAL_SCO ...

  5. 如何破解密码的哈希值,破解双MD5密码值

    这是关于我如何破解密码的哈希值1亿2200万* John the Ripper和oclHashcat-plus故事. 这是几个月前,当我看到一条推特:从korelogic约含共1亿4600万个密码的密 ...

  6. WPF知识点全攻略01- WPF相对WinFrom的优缺点

    对比WPF和WinFrom前,先来了解下GUI现阶段在用的其他一些开发技术: MFC:微软基础类库,以C++的形式封装了Windows API,加上一些实用工具类. QT:奇趣科技开发的跨平台C++图 ...

  7. P2964 [USACO09NOV]硬币的游戏A Coin Game (DP)

    题意:n颗硬币 两个人从前往后按顺序拿 如果上一个人拿了i颗 那么下一个可以拿1-2*i颗 问先手能获得的最大收益 题解:比较典型的最大最小最大最小..DP了 但是暴力做的话是n^3 所以就体现出了这 ...

  8. 【传智播客】Libevent学习笔记(五):基本类型和函数

    目录 00. 目录 01. 基本类型 1.1 evutil_socket_t类型 1.2 标准类型 1.3 各种兼容性类型 02. 可移植的定时器函数 03. 套接字API兼容性 04. 可移植的字符 ...

  9. 关于JVM内存模型,GC策略以及类加载器的思考

    JVM内存模型 Sun在2006年将Oracle JDK开源最终形成了Open JDK项目,两者在绝大部分的代码上都保持一致.JVM的内存模型是围绕着原子性(操作有且仅有一个结果).可见性(racin ...

  10. <Spring Data JPA>二 Spring Data Jpa

    1.pom依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...