• 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
    ",f[n]);
        }
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    Linux vim编辑器
    Linux egrep及bash的变量
    Linux grep及正则表达式
    Linux bash及shell-script
    Linux 用户、组管理以及权限
    Linux 常用快捷键、管道及重定向
    Linux 文件系统
    Linux 系统基础
    Linux 基础命令
    Linux 命令帮助
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13894896.html
Copyright © 2020-2023  润新知