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\)最大(其中 ...
随机推荐
- 【python可视化系列】python数据可视化利器--pyecharts
学可视化就跟学弹吉他一样,刚开始你会觉得自己弹出来的是噪音,也就有了在使用python可视化的时候,总说,我擦,为啥别人画的图那么溜: [python可视化系列]python数据可视化利器--pyec ...
- [luoguP2704] 炮兵阵地(状压DP)
传送门 可以事先把每一行的所有状态处理出来,发现每一行的状态数最多不超过60个 f[i][j][k]表示前i行,第i行为状态j,第i-1行为状态k的最优解 #include <vector> ...
- ESI 动态缓存技术[转载]
任何一个Web网站的内容都是在不断更新和变化,但这并不意味这这个网站的内容就是动态内容,事实上,动态的内容是指用户每次点击 相同的链接时取的的内容是由Web服务器应用程序生成的,如常见得ASP,JSP ...
- 50个必备的实用jQuery代码段(转载)
本文会给你们展示50个jquery代码片段,这些代码能够给你的javascript项目提供帮助.其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一些则是真正有用的函数或方法,他们能够帮助 ...
- 混合APP开发框架资料汇总
Ionic(ionicframework)一款接近原生的Html5移动App开发框架 会html css js就可以开发app,Ionic基于angualrjs框架是一个专注于开发移动wap以及app ...
- 继续畅通工程--hdu1879(最小生成树 模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=1879 刚开始么看清题 以为就是n行 后来一看是n*(n-1)/2行 是输入错误 真是够够的 #incl ...
- 动态规划:Ignatius and the Princess IV
#include<stdio.h> #include<string.h> #include<math.h> int main() { _int64 n,a; whi ...
- poj 2585 Window Pains 暴力枚举排列
题意: 在4*4的格子中有9个窗体,窗体会覆盖它之下的窗体,问是否存在一个窗体放置的顺序使得最后的结果与输入同样. 分析: 在数据规模较小且不须要剪枝的情况下能够暴力(思路清晰代码简单),暴力一般分为 ...
- 对于api安全性的思考
目前的情况下api被很多地方应用,随之而来的是api的安全性问题. 我所认识到的安全性问题有以下几个方面: 1.DDoS(拒绝服务攻击),接口被恶意调用,使真实的用户无法享受到正常畅通的服务. ...
- 记一次UICollectionView中visibleCells的坑
记一次UICollectionView中visibleCells的坑 项目的要求是这样的 其实也是一个轮播图,而已,所以依照轮播图的实现原理,这里觉得也很简单,还是利用UICollectionView ...