2016級算法第二次上機-F.ModricWang's Number Theory II

891 ModricWang's Number Theory II

思路

使得序列的最大公約數不為1,就是大于等于2,就是找到一個大于等于2的數,它能夠整除序列中的所有數。
考慮使得一個數d整除數組中所有數的代價:

如果一個數不能被b整除,那么可以花費x的代價刪掉它,或者通過多次加1使得它可以被d整除,代價應該為 \((d - a[i]\%d) * y\) , \((a[i] \% d == 0s時特判,應該為0)\)

\(l = x / y\)

如果\(d - a[i] \% d <= l\) \((a[i]\%d != 0)\), 這個數產生的代價是 \((d - a[i] \% d) * y\) , 否則是\(x\)

所有代價求和就是總代價,最小的總代價就是答案。

但是這樣枚舉了d和a[i], 復雜度是\(O(n^2)\) 的。
考慮將a[i]換一種方式存儲:b[i]表示值為i的數出現的次數。
這樣d可以將b分成如下若干段:

\([0, d - 1], [d, d * 2 - 1], [d * 2, d * 3 - 1], ... ,[d * i, d * (i + 1) - 1]\)

對于每一段而言,
\([d * (i + 1) - l, d * (i + 1) - 1]\) 內的數應該通過多次加1變成\(d * (i + 1)\) ,

代價應為 \((該區間內數的個數 * d * (i + 1) - 該區間內的數之和) * y\)

\([d * i + 1 , d * (i + 1) - l - 1]\) 內的數應該直接刪除,

代價應為 \(該區間內的個數 * x\)

通過構造相應的前綴和數組,上述操作均可以在\(O(1)\) 的時間復雜度內完成

具體操作時應該注意邊界

因為合數會被質數整除,因此d可以只枚舉質數。

計算時間復雜度需要一些數論知識。首先素數密度(也就是 \(\frac{小于n的素數}{n}\) )可以參見oeis A006880,一個近似解析式為 \(\frac{1}{ln(n)}\),那么\(小于n的素數的總個數\)可以近似為 \(\frac{n}{ln(n)}\)

設小于等于n的素數為\(prime[i]\),素數總數為\(P\),取近似\(P=\frac{n}{ln(n)}\)

求結果部分的復雜度可以寫為 \(\sum_{1}^{P} \frac{n}{prime[i]}\)

參見wikipedia,素數的倒數和又可以近似為 \(\sum_{1}^{p} \frac{1}{prime[i]}=ln(ln(n))\)

因此 \(\sum_{1}^{P} \frac{n}{prime[i]} = O(n* ln(ln(n)))\)

這里得到了計算結果部分的復雜度,還需要加上求素數這個過程的時間復雜度。如果使用樸素篩法,求復雜度的過程正好的上文所述的完全一致,其復雜度為\(O(n*ln(ln(n)))\)。如果使用歐拉篩求素數,復雜度為\(O(n)\)

因此\(O(運行時間)=O(求素數)+O(計算結果)=O(n*ln(ln(n)))\)

代碼

#include<iostream>
#include<cstring>using namespace std;const long long Max_Ai = 1000000*2;
long long n, x, y, l;
long long nums[Max_Ai + 10];
long long s[Max_Ai + 10], sum[Max_Ai + 10];bool valid[Max_Ai + 10];
long long prime[Max_Ai + 10];
long long tot;//線性篩求素數
void init_prime() {memset(valid, true, sizeof(valid));for (int i = 2; i <= Max_Ai; i++) {if (valid[i]) prime[++tot] = i;for (int j = 1; j <= tot && i*prime[j] <= Max_Ai; j++) {valid[i*prime[j]] = false;if (i%prime[j]==0) break;}}
}int main() {
#ifdef ONLINE_JUDGEios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#endifinit_prime();cin >> n >> x >> y;l = x/y;for (long long i = 1; i <= n; i++) {long long p;cin >> p;nums[p]++;    //這是一種比較特別的數字記錄方法,原理類似于基數排序radix sort}for (long long i = 1; i <= Max_Ai; i++) {s[i] = s[i - 1] + nums[i];    //數量和sum[i] = sum[i - 1] + nums[i]*i;    //前綴和}auto min_cost = (long long) 1e18;for (long long i = 1; i <= tot; i++) {long long k = prime[i];long long now_cost = 0;for (long long j = 0; j <= Max_Ai; j += k) {long long mid = max(j + k - l - 1, j);long long bound = min(j + k - 1, Max_Ai);if (bound > mid) {now_cost += ((s[bound] - s[mid])*(j + k) - (sum[bound] - sum[mid]))*y;now_cost += (s[mid] - s[j])*x;} else {now_cost += (s[bound] - s[j])*x;}}min_cost = min(min_cost, now_cost);}cout << min_cost << "\n";return 0;
}

轉載于:https://www.cnblogs.com/AlvinZH/p/7761607.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454177.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454177.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454177.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

常用css屬性集(持續更新…)

禁止換行&#xff0c;超出部分顯示…&#xff1a;a. 代碼&#xff1a;.hide_word{ max-width: 100px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } b. 效果&#xff1a; 本文轉自 bilinyee博客&#xff0c;原文鏈接&#xff1a; http://blog.51cto.co…

parallels網絡初始化失敗_33 個神經網絡「煉丹」技巧

自然語言處理Andrej Karpathy 是深度學習計算機視覺領域、與領域的研究員。博士期間師從李飛飛。在讀博期間&#xff0c;兩次在谷歌實習&#xff0c;研究在 Youtube 視頻上的大規模特征學習&#xff0c;2015 年在 DeepMind 實習&#xff0c;研究深度強化學習。畢業后&#xff0…

《操作系統》OS學習(三):系統調用

例子 首先看一個標準C庫的例子&#xff1a;當我們程序中使用了C庫中的printf()函數&#xff0c;實際在底層是在內核態中調用了write()函數。圖中右側則是將程序代碼與C庫都算到應用程序中&#xff0c;內核提供了一個系統調用接口。 從這個例子我們可以得到以下幾點&#xff1a…

cygwin/gcc與MinGW

cygwin/gcc和MinGW都是gcc在windows下的編譯環境&#xff0c;但是它們有什么區別?在實際工作中如何選擇這兩種編譯器呢?cygwin/gcc完全可以和在linux下的gcc劃等號&#xff0c;這個從boost庫的劃分中就可以看出來端倪&#xff0c;cygwin下的gcc和linux下的gcc使用的是相同的T…

JavaScript服務器端開發技術(對象屬性的枚舉與查詢)

既然對象是屬性的集合&#xff0c;那么檢測與枚舉集合中的屬性就是一項重要任務。對此&#xff0c;我們來分別看一下ES3和ES5提供的解決方案。 1) ES3枚舉方案 示例代碼&#xff1a; var contacts{ ID:[0,1,2,3,4,5], names:["Zero","One","Two&q…

treelistview 所有節點失去焦點_垃圾詢盤過濾,焦點科技的 Milvus 實踐

文章作者&#xff1a;黎陽&#xff0c;焦點科技軟件開發工程師李成龍&#xff0c;Zilliz 數據工程師Milvus (https://milvus.io/) 向量搜索引擎開源半年以來&#xff0c;全球已經有數百家企業或組織用戶。焦點科技是一家以 B2B 外貿交易為主營業務的科技公司&#xff0c;也是 M…

《操作系統》OS學習(四):計算機體系結構、內存層次和地址生成

計算機除了計算能力之外還有存儲能力&#xff0c;存儲能力即計算機擁有一系列的存儲介質&#xff0c;我們可以在存儲介質上存儲我們的代碼和數據。計算機體系結構中約定了哪些地方可以用來存儲數據&#xff1a;CPU內的寄存器、內存和外存。不同的存儲介質&#xff0c;容量、速度…

GCC中SIMD指令的應用方法

X86架構上的多媒體應用開發&#xff0c;如果能夠使用SIMD指令進行優化&#xff0c; 性能將大大提高。目前&#xff0c;IA-32的SIMD指令包括MMX&#xff0c;SSE&#xff0c;SSE2等幾級。 在GCC的開發環境中&#xff0c;有幾種使用SIMD指令的方式&#xff0c;本文逐一介紹。X86的…

使用angular4和asp.net core 2 web api做個練習項目(二), 這部分都是angular

上一篇: http://www.cnblogs.com/cgzl/p/7755801.html 完成client.service.ts: import { Injectable } from angular/core; import { Http, Headers } from angular/http; import { Observable } from rxjs/Observable; import { ErrorHandler } from angular/core; import rxj…

leelen可視對講怎么接線_樓宇對講系統怎么布線 樓宇對講系統布線方式【介紹】...

隨著智能小區規模不斷增加&#xff0c;樓宇可視對講系統應用越來越廣泛&#xff0c;因而視頻信號的傳輸方式與布線設計顯得越來越重要。視頻信號與數據和音頻信號不同&#xff0c;可行的一種傳輸方式為視頻信號基帶傳輸&#xff0c;下面小編就簡要介紹一下這種傳輸方式和布線方…

路由匯總實例

5.2.2.2 路由匯總策略 之前提到過&#xff0c;在網絡管理員計劃好子網選擇并進行預期地路由匯總時&#xff0c;手動路由匯總工作能取得最佳效果。例如&#xff0c;之前的例子設定好了一個考慮周全的計劃&#xff0c;管理員只使用遠離Yosemite路由器并以10.2開頭的子網。這個規定…

《操作系統》OS學習(五):連續內存分配 內存碎片、動態分配、碎片整理、伙伴系統

內存碎片 在沒有其他方式輔助的情況下&#xff0c;我們分配給一個進程的內存是連續的。在分配時候我們需要有動態分配與碎片處理。如何理解呢&#xff1f;就是每個進程需要一塊內存&#xff0c;我們要選取合適的位置的內存分配給它。當有的進程先結束了內存還給操作系統&#…

GCC 中文手冊 - 摘自純C論壇

GCC Section: GNU Tools (1) Updated: 2003/12/05 Index Return to Main Contents NAME gcc,g-GNU工程的C和C編譯器(egcs-1.1.2) 總覽(SYNOPSIS) gcc[option|filename ]... g[option|filename ]... 警告(WARNING) 本手冊頁內容摘自GNU C編譯器的完整文檔,僅限于解釋選項的含義…

python如何實現支持中文

#codingutf-8print("我要python支持中文") 默認情況下&#xff0c;python是不支持中文的。 如果要實現python支持中文&#xff08;我是從python3.6開始學習的&#xff09;&#xff0c;只要在python文檔的開頭加入&#xff1a;“#codingutf-8"就可以了。轉載于:h…

世界之窗瀏覽器刪除文本框信息_文本框——Excel里的便利貼

工作表里面的單元格應該是足夠我們來記錄數據和信息了。但是文本框這個功能在工作表中還是存在&#xff0c;可以理解為便利貼功能。插入文本框1.點擊“插入”選項卡。2.然后點擊“文本框”。3.在下拉菜單里面&#xff0c;有兩種可供選擇&#xff1a;橫排文本框和垂直文本框。在…

RHEL 5服務篇—常用網絡配置命令

常用網絡配置命令 在“Linux系統管理”的文章中&#xff0c;大家已經學習了Linux系統的基本管理命令和技巧&#xff0c;為了進一步學習Linux網絡服務打下了良好的基礎。所以我作者以后將陸續推出Linux網絡服務的相關文章。希望大家能給與我大大的支持。 今天我們就來學習一下…

清華大學《操作系統》(六):非連續內存分配 段式、頁式、段頁式存儲管理

背景 連續內存分配給內存分配帶來了很多不便&#xff0c;可能所有空閑片區大小都無法滿足需求大小&#xff0c;這個分配就會失敗。基于這種現狀&#xff0c;就有了非連續內存分配的需求。非連續分配成功的幾率更高&#xff0c;但也面對更多的問題&#xff0c;比如分配時是不是…

python監控文件內容變化_Python監控文件內容變化

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存儲NAS是一個可共享訪問&#xf…

C語言第三次博客作業---單層循環結構

一、PTA實驗作業。 題目1 1.實驗代碼 int n,i; double height1,height2;//1為輸入身高&#xff0c;2為輸出身高。 char sex; //1<height1<3; //N<1; scanf("%d",&n); while(n--){getchar();scanf("%c%lf",&sex,&height1);switch(sex)…

函數和函數式編程

python的過程就是函數&#xff0c;因為解釋器會隱式地返回默認值None。 實際編程中大部分偏函數更接近過程&#xff0c;不顯示地返回任何東西。 當沒有顯示地返回元素或者如果返回None時&#xff0c;python會返回一個None。 * 元組 ** 字典 def子句的剩余部分包括了一個雖…