2020CCPC(威海) - Clock Master(数论+分组背包)
题目大意:给出一个数字 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(数论+分组背包)相关推荐
- 2020CCPC威海
2020CCPC威海 2020CCPC威海榜单 题号 题目 知识点 难度 A Golden Spirit 思维,推导题 签到题 B Labyrinth dfs+思维 金牌题 C Rencontre D ...
- L - Clock Master Gym - 102798L
L - Clock Master Gym - 102798L 题意: 给定一个数字n,令n=a1+a2+a3-求lcm(a1,a2,a3,-)的最大值,以loge(x)的形式输出 题解: lcm要求尽 ...
- [bzoj1025][SCOI2009]游戏 (分组背包)
Description windy学会了一种游戏.对于1到N这N个数字,都有唯一 且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,--,N写一排在纸上.然后再在这一排下面写上它们 ...
- 分组背包----HDU1712 ACboy needs your help
很简单的一道分组背包入门问题.不多解释了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g ...
- HDU 3033 I love sneakers! (分组背包变形)
题目大意:xx去买鞋,有k种牌子,然后给出n双鞋,每双鞋有它属于的牌子.价格.收藏价值.xx认为他不差钱,要求每种鞋子买一双.但实际上他只有m毛钱,问能否买到符合xx要求的鞋,能找到的话输出最大的收藏 ...
- hdu 1712(分组背包)
题意:有N个课程,然后选择M天内学习的效益最大值,注意每个课程最多选取一次. 解题思路:裸的分组背包,把每门课程看做是每一组,每一组里面最多选择一个天数,典型的分组背包.详见背包九讲 #include ...
- hdu 3033(分组背包)
题意:有S款运动鞋,一个n件,总钱数为m,求不超过总钱数且每款鞋子至少买一双的情况下,使价值最大.如果 有一款买不到,就输出"Impossible". 解题思路:分组背包,和背包九 ...
- zcmu2165(分组背包)
2165: 黄金矿工 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 86 Solved: 41 [Submit][Status][Web Board ...
- 2019年湘潭大学程序设计竞赛(重现赛)补题:H.Chat(分组背包)
链接:https://ac.nowcoder.com/acm/problem/25581 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
最新文章
- oracle mysql客户端——SqlDeveloper
- Less和Sass的使用
- 普林斯顿计算机科学系,普林斯顿大学计算机科学系
- 计算机视觉与深度学习 | TensorMask: A Foundation for Dense Object Segmentation(何凯明团队新作)近5年目标检测综述
- mysql企业版多少钱_企业资质代办多少钱
- 华为荣耀20计算机,华为云电脑将停止服务/荣耀新机保护壳曝光/小米新机渲染图曝光...
- Python——列表中存放字典遇到的问题
- 金融区块链底层平台FISCO BCOS白皮书
- 计算机硬件故障有哪些现象,计算机常见硬件故障症状现象分析及解决办法
- QQ群排名霸屏:快速上排名方法
- 标题:《东邪西毒》台词全本(国语版) (转)
- 读万卷书,行万里路,写万行Code
- systemverilog 中的always_comb, always_latch, always_ff
- 使用java代码根据三角形的三个顶点坐标计算出三角形的中心点(重心)
- 切西瓜法实现微信抢红包功能
- 小米10周年发布会后,我路转粉了!
- 企业数据战略中,什么样的数据才能算是真正的数据资产
- 嵌入式 Linux 编程
- AUTOCAD——特性匹配
- 【中英双语】Linux黑客教程从初学者到高级!