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]);
    }
}
View Code

 

posted @ 2020-10-29 09:16  朝暮不思  阅读(114)  评论(0编辑  收藏  举报