L - Clock Master Gym - 102798L
生活随笔
收集整理的這篇文章主要介紹了
L - Clock Master Gym - 102798L
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
L - Clock Master Gym - 102798L
題意:
給定一個數字n,令n=a1+a2+a3…求lcm(a1,a2,a3,…)的最大值,以loge(x)的形式輸出
題解:
lcm要求盡可能大,我們就要保證a1,a2,a3…盡可能為質數或質數的整數次冪,我們假設a1是p1x,a2是p2y,p1和p2是不同的質數,x的取值范圍是[1~m],p1m<=n,x有且只能在這個取值范圍中取一個,也就是我們按照質數的種類分組,每組中是不同的冪次。
我們將每個素數的不同冪次劃分為一組,每個組我們最多只能選一個(也可以不選),問在n范圍內,所能選的p1 * p2 *…的最大值
這個看著像什么?
有N件物品和一個容量為V的背包。第i件物品的費用是w[i],價值是v[i]。這些物品被劃分為若干組,每組中的物品互相沖突,最多選一件。求解將哪些物品裝入背包可使這些物品的費用總和不超過背包容量,且價值總和最大。
沒錯就是分組背包,容量V就是n,每組的物品就是p1的整數次冪,價值就是所選p1的整數次冪去log(因為題目輸出要求),費用就是p1的整數次冪
log(p1 * p2 * p3…) = log(p1)+log(p2)+…
所以直接累加lg[x]
預處理出所有答案
代碼:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 3e4 + 10; const int mod = 1e9 + 7; int pri[N], tot; double dp[N], Log[N]; bool vis[N]; void init() {memset(vis, 0, sizeof(vis));vis[0] = vis[1] = 1;tot = 0;for(int i = 2; i < N; ++i) {if(!vis[i]) {pri[++tot] = i;for(int j = i + i; j < N; j += i)vis[j] = 1;}}for(int i = 0; i < N; ++i) Log[i] = log(i);//首先預處理出log答案 for(int i = 1; i <= tot; ++i) {//對于tot個分組 for(int j = N - 1; j >= pri[i]; --j) {//容量 for(int k = pri[i]; k <= j; k *= pri[i])//枚舉pri[i]的整數次冪 dp[j] = max(dp[j], dp[j - k] + Log[k]);}} }int main() {init();int t, n;scanf("%d", &t);while(t--) {scanf("%d", &n);printf("%.9f\n", dp[n]);}return 0; }總結
以上是生活随笔為你收集整理的L - Clock Master Gym - 102798L的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白内障会导致流眼泪吗
- 下一篇: C - Rencontre Gym -