题目大意:给出一个数字 n ,要求分解成:a[ 0 ] + a[ 1 ] + ... +  a[ m ] = n,( m 没有约束 ),使得 lcm( a[ 0 ] , a[ 1 ] , ... a[ m ] ) 最大,输出这个最大值的对数

题目分析:看到 lcm 就可以去思考如何快速求出 n 个数的 lcm,比较简单的一种方法就是将每个数进行质因子分解,对于每个质因子 p 来说,取 n 个数中 p^k[ i ] 的最大值,就是质因子 p 的贡献了,所有质因子的贡献的乘积就是需要求的 lcm

所以这个题目的模型就比较简单了,尝试将 n 分解为  使得  尽可能大,到此为止,再看一下题面需要求的对数,不难发现对数只是为了保证精度的,因为对数函数是单调递增的,所以套上对数的公式将目标转换为:使得  尽可能大

换句话说,花费  的容量可以获得  的价值,且目标容量为 n,且每个质因子 p 只能选择一种幂次,这就是分组背包的模板题目了,设质数的幂次集合为 ,那么 ,可以先预处理一下,时间复杂度为 O( n * n / logn ),然后就可以 O( 1 ) 查询了

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=3e4+100;double ans[N],Log[N];int cnt,pri[N];bool vis[N];double dp[N];void P()
{for(int i=2;i<N;i++){if(!vis[i])pri[cnt++]=i;for(int j=0;j<cnt&&pri[j]*i<N;j++){vis[pri[j]*i]=true;if(i%pri[j]==0)break;}}
}void init()
{for(int i=1;i<N;i++)Log[i]=log(i);for(int i=0;i<N;i++)dp[i]=0;dp[0]=0;for(int i=0;i<cnt;i++)//枚举质数 for(int j=N-1;j>=pri[i];j--)//容量 for(int k=pri[i];k<N;k*=pri[i])//当前的幂次 if(j>=k)dp[j]=max(dp[j],dp[j-k]+Log[k]);
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);P();init();int w;cin>>w;while(w--){int n;scanf("%d",&n);printf("%.10f\n",dp[n]);}return 0;
}

2020CCPC(威海) - Clock Master(数论+分组背包)相关推荐

  1. 2020CCPC威海

    2020CCPC威海 2020CCPC威海榜单 题号 题目 知识点 难度 A Golden Spirit 思维,推导题 签到题 B Labyrinth dfs+思维 金牌题 C Rencontre D ...

  2. L - Clock Master Gym - 102798L

    L - Clock Master Gym - 102798L 题意: 给定一个数字n,令n=a1+a2+a3-求lcm(a1,a2,a3,-)的最大值,以loge(x)的形式输出 题解: lcm要求尽 ...

  3. [bzoj1025][SCOI2009]游戏 (分组背包)

    Description windy学会了一种游戏.对于1到N这N个数字,都有唯一 且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,--,N写一排在纸上.然后再在这一排下面写上它们 ...

  4. 分组背包----HDU1712 ACboy needs your help

    很简单的一道分组背包入门问题.不多解释了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g ...

  5. HDU 3033 I love sneakers! (分组背包变形)

    题目大意:xx去买鞋,有k种牌子,然后给出n双鞋,每双鞋有它属于的牌子.价格.收藏价值.xx认为他不差钱,要求每种鞋子买一双.但实际上他只有m毛钱,问能否买到符合xx要求的鞋,能找到的话输出最大的收藏 ...

  6. hdu 1712(分组背包)

    题意:有N个课程,然后选择M天内学习的效益最大值,注意每个课程最多选取一次. 解题思路:裸的分组背包,把每门课程看做是每一组,每一组里面最多选择一个天数,典型的分组背包.详见背包九讲 #include ...

  7. hdu 3033(分组背包)

    题意:有S款运动鞋,一个n件,总钱数为m,求不超过总钱数且每款鞋子至少买一双的情况下,使价值最大.如果 有一款买不到,就输出"Impossible". 解题思路:分组背包,和背包九 ...

  8. zcmu2165(分组背包)

    2165: 黄金矿工 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 86  Solved: 41 [Submit][Status][Web Board ...

  9. 2019年湘潭大学程序设计竞赛(重现赛)补题:H.Chat(分组背包)

    链接:https://ac.nowcoder.com/acm/problem/25581 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

最新文章

  1. oracle mysql客户端——SqlDeveloper
  2. Less和Sass的使用
  3. 普林斯顿计算机科学系,普林斯顿大学计算机科学系
  4. 计算机视觉与深度学习 | TensorMask: A Foundation for Dense Object Segmentation(何凯明团队新作)近5年目标检测综述
  5. mysql企业版多少钱_企业资质代办多少钱
  6. 华为荣耀20计算机,华为云电脑将停止服务/荣耀新机保护壳曝光/小米新机渲染图曝光...
  7. Python——列表中存放字典遇到的问题
  8. 金融区块链底层平台FISCO BCOS白皮书
  9. 计算机硬件故障有哪些现象,计算机常见硬件故障症状现象分析及解决办法
  10. QQ群排名霸屏:快速上排名方法
  11. 标题:《东邪西毒》台词全本(国语版) (转)
  12. 读万卷书,行万里路,写万行Code
  13. systemverilog 中的always_comb, always_latch, always_ff
  14. 使用java代码根据三角形的三个顶点坐标计算出三角形的中心点(重心)
  15. 切西瓜法实现微信抢红包功能
  16. 小米10周年发布会后,我路转粉了!
  17. 企业数据战略中,什么样的数据才能算是真正的数据资产
  18. 嵌入式 Linux 编程
  19. AUTOCAD——特性匹配
  20. 【中英双语】Linux黑客教程从初学者到高级!

热门文章

  1. 国防科技大学计算机学院少将,国防科技大学新任副校长兼教育长晋升少将,前任是计算机权威专家...
  2. matlab 柱面投影,matlab练习程序(圆柱投影)
  3. redis分布式缓存(二)
  4. RabbitMQ消息应答
  5. 初步认识Volatile-总线锁和缓存锁
  6. Redis中的I/O 多路复用(I/O Multiplexing)
  7. webpack打包css文件
  8. MapReduce案例-wordcount-准备工作
  9. ReactJS入门之组件
  10. 案例_文件下载_代码实现