UVa 1642 - Magical GCD(數論)

來源:互聯網
上載者:User

標籤:gcd   ble   uva   乘積最大   turn   roman   簡化   連結   vector   

連結:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4517

 

題意:

輸入一個n(n≤100000)個元素的正整數序列,求一個連續子序列,使得該序列中所有元素的最大公約數與序列長度的乘積最大。
例如,5個元素的序列30, 60, 20, 20, 20的最優解為{60, 20, 20, 20},乘積為gcd(60,20,20,20)*4=80。

 

分析:

從左至右枚舉序列的右邊界j,然後快速求出左邊界i≤j,使得MGCD(i,j)最大。
其中MGCD(i,j)定義為gcd(a[i],a[i+1],...,a[j])*(j-i+1)。
考慮序列5, 8, 6, 2, 6, 8,當j=5時需要比較i=1, 2, 3, 4, 5時的MGCD(i,j),如下表所示:

i=1,gcd運算式=gcd(5,8,6,2,6),gcd值=1,序列長度=5。
i=2,gcd運算式=gcd(8,6,2,6),gcd值=2,序列長度=4。
i=3,gcd運算式=gcd(6,2,6),gcd值=2,序列長度=3。
i=4,gcd運算式=gcd(2,6),gcd值=2,序列長度=2。
i=5,gcd運算式=gcd(6),gcd值=6,序列長度=1。

從下往上看,gcd運算式裡每次多一個元素,有時gcd不變,有時會變小,而且每次變小時一定是變成了它的某個約數。
換句話說,不同的gcd值最多隻有logj種!當gcd值相同時,序列長度越大越好,所以可以把表簡化一下:

gcd值=1,i=1。
gcd值=2,i=2。
gcd值=6,i=5。

因為表裡只有logj個元素,所以可以依次比較每一個i對應的MGCD(i,j),時間複雜度為O(logj)。
下面考慮j從5變成6時,這個表會發生怎樣的變化。
首先,上述所有gcd值都要再和a6=8取gcd,然後要加入i=6的項目,gcd值為8。
由於相同的gcd值只需要保留i的最小值,所以i=5被刪除,最終得到如下表所示結果。

gcd值=1,i=1。
gcd值=2,i=2。
gcd值=8,i=6。

總時間複雜度為O(nlogn)。

 

代碼:

 1 #include <cstdio> 2 #include <vector> 3 using namespace std; 4  5 typedef long long int LLI; 6 struct Item { 7     LLI g; 8     int p; 9 };10 11 LLI gcd(LLI a, LLI b) {12     return b == 0 ? a : gcd(b, a%b);13 }14 15 int main() {16     int T, n;17     LLI v, ans;18     scanf("%d", &T);19     while(T--) {20         ans = 0;21         vector<Item> vec;22         scanf("%d", &n);23         for(int t = 0; t < n; t++) {24             scanf("%lld", &v);25             for(int i = 0; i < vec.size(); i++) vec[i].g = gcd(vec[i].g, v);26             vec.push_back((Item){v,t});27             vector<Item> nvec;28             for(int i = 0; i < vec.size(); i++) {29                 if(i != 0 && vec[i].g == vec[i-1].g) continue;30                 ans = max(ans, vec[i].g * (t-vec[i].p+1));31                 nvec.push_back(vec[i]);32             }33             vec = nvec;34         }35         printf("%lld\n", ans);36     }37     return 0;38 }

 

UVa 1642 - Magical GCD(數論)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.