ural 1807

给定一个数,分解成k个数之和,使得这K个数公约数最大,最小公倍数也最大。

最大公约数最大,肯定选择除以素数分解后的最小素数。

现在相当于分解质数m使得最小公倍数最大。

用dp[i][j]表示用前i个质数分解和为m最小公倍数最大。

最后一定是2 ^ k1 * 3 ^ k2 * 5 ^ k3....

所以可以写出dp转移出来。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>

using namespace std;

const int INF = 1000000007;
const int maxn = 100007;
long long least;
int vis[maxn], prime[maxn], prime_num;
int ans[maxn], ans_num, temp[maxn];
int pre[156][35000];
double dp[156][35000];
long long big_lcm;
long long n, f;

void getAllPrime() {
    memset(vis, 0, sizeof(vis));
    for (int i = 2; i <= sqrt(maxn * 1.0); i++) {
        if (!vis[i]) {
            for (int j = i * i; j < maxn; j += i) {
                vis[j] = 1;
            }
        }
    }
    prime_num = 0;
    for (int i = 2; i < maxn; i++) {
        if (!vis[i]) {
            prime[++prime_num] = i;
        }
    }
}

int main() {
//    freopen("in.txt", "r", stdin);
    long long x;
    getAllPrime();
    scanf("%I64d", &n);
    int flag = 0;
    for (int j = 1; j <= prime_num; j++) {
        if (n % prime[j] == 0) {
            flag = 1;
            least = prime[j];
            break;
        }
    }
    if (!flag) {
        least = n;
    }
    long long big_gcd = n / least;
    big_lcm = 0;
    flag = 0;
    if (least == 2) {
        printf("%I64d %I64d\n", big_gcd, big_gcd);
        return 0;
    }
    if (least == 3) {
        printf("%I64d %I64d\n", big_gcd, big_gcd * 2);
        return 0;
    }
    for (int i = 1; i <= 150; i++) {
        for (int j = 0; j <= least; j++) {
            dp[i][j] = dp[i - 1][j];
            pre[i][j] = j;
            int cnt = prime[i];
            double t = log(prime[i] * 1.0);
            for (int k = 1; cnt <= j; k++) {
                double temp = k * t;
                if (dp[i][j] < dp[i - 1][j - cnt] + temp) {
                    pre[i][j] = j - cnt;
                    dp[i][j] = dp[i - 1][j - cnt] + temp;
                }
                cnt *= prime[i];
            }
        }
    }
//    for (int i = 1; i <= 150; i++) {
//        for (int j = 0; j <= least; j++) {
//            dp[i][j] = dp[i - 1][j];
//            pre[i][j] = j;
//        }
//        for (int j = prime[i]; j <= least; j *= prime[i]) {
//            double temp = log(j * 1.0);
//            for (int k = j; k <= least; k++) {
//                if (dp[i][k] < dp[i - 1][k - j] + temp) {
//                    dp[i][k] = dp[i - 1][k - j] + temp;
//                    pre[i][k] = k - j;
//                }
//            }
//        }
//    }
    int tot = least;
    for (int i = 150; i >= 1; i--) {
        if ((tot - pre[i][tot]) != 0) {
            printf("%I64d ", (tot - pre[i][tot]) * big_gcd);
            tot = pre[i][tot];
        }
    }
    while (tot > 0) {
        printf("%I64d ", big_gcd);
        tot--;
    }
    printf("\n");
    return 0;
}

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值