2020ccpc威海 L Clock Master(分组背包)
比较容易看的出来的是这题求得是最小公倍数的最大值
然后我们可以发现一定是选不同质数的次幂,因此每个质数的次幂就是一个集合,因此只需要跑一下分组背包就可以了
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=5e5+10; int prime[N]; double lg[N]; int cnt; int vis[N]; double f[N]; void get(){ int i,j; for(i=2;i<=30000;i++){ if(!vis[i]){ prime[++cnt]=i; } for(int j=1;i*prime[j]<=30000;j++){ vis[prime[j]*i]=1; if(i%prime[j]==0) break; } } } void init(){ int i,j,k; lg[1]=0; for(i=1;i<=30000;i++){ lg[i]=log(i); } for(i=1;i<=cnt;i++){ for(j=30000;j>=prime[i];j--){ for(k=prime[i];k<30000;k*=prime[i]){ if(j>=k){ f[j]=max(f[j],f[j-k]+lg[k]); } } } } } int main(){ //ios::sync_with_stdio(false); int t; cin>>t; get(); init(); while(t--){ int n; scanf("%d",&n); printf("%.9f\n",f[n]); } }
没有人不辛苦,只有人不喊疼