hdu3092
题目链接: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的更多相关文章
- HDU-3092 Least common multiple---数论+分组背包
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3092 题目大意: 有一个数字n,现在要把它分解成几个数字相加!然后这几个数字有最小公倍数,题目目的是 ...
- HDU3092:Least common multiple(素数筛选+完全背包)
题意 给出\(n\)和\(m\),将\(n\)拆成任意个数,求它们的最大的\(lcm\) 分析 1.可以证明\(n=p1^{s1}*p2^{s2}*...*pn^{sn}\)时\(lcm\)最大(其中 ...
随机推荐
- [luoguP3178] [HAOI2015]树上操作(dfs序 + 线段树 || 树链剖分)
传送门 树链剖分固然可以搞. 但还有另一种做法,可以看出,增加一个节点的权值会对以它为根的整棵子树都有影响,相当于给整棵子树增加一个值. 而给以某一节点 x 为根的子树增加一个权值也会影响当前子树,节 ...
- [luoguP1198][JSOI2008] 最大数(线段树 || 单调栈)
题目传送门 1.线段树 线段树可以搞. 不过慢的要死1300+ms #include <cstdio> #include <iostream> using namespace ...
- hdu 3371
#include<stdio.h> #include<stdlib.h> #define N 501 struct node { int x,y,dis; }road[N*N] ...
- 用DW制作简单的浮动广告
原文发布时间为:2008-11-08 -- 来源于本人的百度文章 [由搬家工具导入] 浮动广告可以用层和时间轴结合做出,先选择你的dreamweaver“窗口”,然后从“窗口”菜单中选择“时间轴”,时 ...
- redis哨兵模式配置
java对redis的读写 依赖包:jedis.jar maven下: <!-- https://mvnrepository.com/artifact/redis.clients/jedis - ...
- HDU 5521 Meeting【最短路】
今天旁观了Angry_Newbie的模拟区域赛(2015shenyang) 倒着看最先看的M题,很明显的最短路问题,在我看懂的时候他们已经开始敲B了. 后来听说D过了很多人.. D题一看是个博弈,给了 ...
- Maven新建webapp项目报错Could not resolve artifact org.apache.maven.archetypes:maven-archetype-webapp:pom:RELEASE
Windows-Preferences 在搜索框输入maven,点击下面的Archetypes--->Add Remote Catalog... 对应输入 http://repo1.maven. ...
- linux下查看哪个进程占用内存多
1.用top命令 1.top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令后,查看%MEM的内容.可以 ...
- InfluxDB useful commands
InfluxDB 配置文件地址:/etc/influxdb/influxdb.conf 通过curl写数据 curl -i -XPOST 'http://localhost:8086/write?db ...
- 【转】c++ 如何批量初始化数组 fill和fill_n函数的应用
http://blog.csdn.net/sunquana/article/details/9153213 一. fill和fill_n函数的应用: fill函数的作用是:将一个区间的元素都赋予val ...