题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3092

题目描述:将一个数拆分成几个数之和,问这几个数能得到的最大的最小公倍数模上给定的一个数是多少?

分析:首先这些数互质时,最小公倍数最大,考虑到素数都是互质的,猜想可能都被拆分成了素数,

证明:假设这些数被拆分成了m1+m2+m3+...+mk;除mk是合数外其余数都是素数,

mk可以写成一个素数和另外一个数的乘积,mk=a*b,所求的最大的最小公倍数就是m1*m2*m3*...*mk;

然而由于a+b<a*b;将mk分成a+b+(mk-(a+b)),得到的结果肯定比直接加上mk要大,

所以就证明了这些数都为素数。

证明 a+b<a*b;

  1 < (a-1)(b-1);(a>1 && b>1)

  1 < a*b-a-b +1;

a+b+1 < a*b+1   ;

注意到这些素数的乘积可能特别大,所以两边同时去ln,变成加法;

#include <iostream>
#include <cstdio>
#include <cstring >
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
#define maxn 3100
int prime[maxn];
double d[maxn];
int ans[maxn];
int vis[maxn];
int n,MOD;
void init()
{
memset(ans,,sizeof(ans));
memset(d,,sizeof(d));
}
int pow(int a,int b)
{
int answer=;
for(int i=;i<=b;i++)
answer*=a;
return answer;
}
void solve()
{
for(int j=;j<=n;j++)
{
d[j]=;
ans[j]=;
}
for(int i=;prime[i]<=n;i++)
{
for(int j=n;j>=;j--)
{
for(int k=;pow(prime[i],k)<=j;k++)
//对于第k个素数,有两种选择
{
int s=pow(prime[i],k);
if(j>=s)
if(d[j-s]+log(s*1.0) > d[j] )
{
d[j]=d[j-s]+log(s*1.0);
ans[j]= ( (ans[j-s]*s) )%MOD;
}
}
//printf("%d ",ans[j]);
}
// printf("\n");
}
printf("%d\n",ans[n]);
}
int main()
{
//cout<<log(2.718281828459)<<endl;
int N=maxn-;
int m=sqrt(N+0.5);
memset(vis,,sizeof(vis));
for(int i=;i<=m;i++)
if(!vis[i])
for(int j=i*i;j<=N;j+=i)
vis[j]=;
int t=;
for(int i=;i<=N;i++)
if(vis[i]==)
prime[t++]=i;
/* for(int i=1;i<10;i++)
{
printf("%d ",prime[i]);
}*/
//cout<<endl;
while(~scanf("%d%d",&n,&MOD))
{
init();
solve();
}
return ;
}

   

    

hdu3092的更多相关文章

  1. HDU-3092 Least common multiple---数论+分组背包

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3092 题目大意: 有一个数字n,现在要把它分解成几个数字相加!然后这几个数字有最小公倍数,题目目的是 ...

  2. HDU3092:Least common multiple(素数筛选+完全背包)

    题意 给出\(n\)和\(m\),将\(n\)拆成任意个数,求它们的最大的\(lcm\) 分析 1.可以证明\(n=p1^{s1}*p2^{s2}*...*pn^{sn}\)时\(lcm\)最大(其中 ...

随机推荐

  1. 【带权并查集】HDU 3047 Zjnu Stadium

    http://acm.hdu.edu.cn/showproblem.php?pid=3047 [题意] http://blog.csdn.net/hj1107402232/article/detail ...

  2. 【Kruscal最小生成树】D. Jungle Roads

    https://www.bnuoj.com/v3/contest_show.php?cid=9154#problem/D [Accepted] #include<iostream> #in ...

  3. hdu 4790 数学

    /* 题意:给你二个区间[a,b]和[c,d] 分别从中选一个数x和y使的(x+y)%p=m; 可以这样来求,先求出(0->b和0->d区间段的值)-(区间0->a-1和0-> ...

  4. 反编译sencha toucha打包的apk文件,修改应用名称支持中文以及去除应用标题栏

    一.去除安卓应用标题栏 sencha touch打包android安装包,去掉标题栏titlebar的简单方法 (有更复杂更好的方法,参看"二.利用反编译修改apk的应用名称为中文" ...

  5. hdu4405:Aeroplane chess

    题目大意:有编号为0-n的格子,从0开始,扔骰子扔到几就走几格.有m个瞬移点,每个点可以从格x直接飞到格y,若瞬移到另一个瞬移点可以继续瞬移.求到达格n的期望扔骰子次数. 题解:期望DP入门好题.网上 ...

  6. Mysql相关工具

    •Mysql相关工具 –Mysqlslap  压力测试工具 –Mysqlsla  日志分析工具 –Mysqlreport   效能监控工具 –Mysqlproxy  快速实现读写分离以及负载均衡 –p ...

  7. Spring下的@Inject、@Autowired、@Resource注解区别(转)

    1.@Inject javax.inject JSR330 (Dependency Injection for Java) 这是JSR330中的规范,通过AutowiredAnnotationBean ...

  8. 基于gulp编写的一个简单实用的前端开发环境

    自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...

  9. zz年度热门编程语言排行榜

    原文在这里:Link 蛮有意思的,可以看看.

  10. Linux如何更新软件源

    Linux软件源的设置方法 1 打开数据源配置文件 vi /etc/apt/sources.list     添加相关的数据源,可以选择以下的数据源,不要写太多,否则会影响更新速度.   之后使用ap ...