日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

L - Clock Master Gym - 102798L

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。