藍橋杯 倍數問題(餘數優化複雜度在1e6)

2021-10-23 05:28:56 字數 1165 閱讀 6409

眾所周知,小蔥同學擅長計算,尤其擅長計算乙個數是否是另外乙個數的倍數。

但小蔥只擅長兩個數的情況,當有很多個數之後就會比較苦惱。

現在小蔥給了你 n 個數,希望你從這 n 個數中找到三個數,使得這三個數的和是 k 的倍數,且這個和最大。

資料保證一定有解。

輸入格式

第一行包括 2 個正整數 n, k。

第二行 n 個正整數,代表給定的 n 個數。

輸出格式

輸出一行乙個整數代表所求的和。

資料範圍

1≤n≤105,

1≤k≤103,

給定的 n 個數均不超過 108

431

234

9
解題思路:本題顯然通過暴力搜尋會超時,用dfs應該也只能得到部分分。本題可採用對餘數進行搜尋,因為(a+b+c) % k = 0那麼我們可以得到(a%k+b%k+c%k)%k = 0所以我們可以通過搜尋餘數得出第三個餘數為多少:加入列舉了兩個餘數i,j那麼第三個餘數為(k-(i+j)%k)%k,用vector陣列儲存響應餘數所對應的值。具體看**:

#include

#include

#include

#include

using

namespace std;

vector<

int> a[

1010];

intmain

(void

)for

(int i =

0; i < k; i++

)int ans =0;

for(

int i =

0; i < k; i++

)else

if(i == j && i != t)

else

if(i == t && j != t)

else

if(j == t && i != t)

else

} ans =

max(ans, sum);}

}printf

("%d"

, ans)

;return0;

}

藍橋杯倍數問題

題目描述 現在小蔥給了你 n 個數,希望你從這 n 個數中找到三個數,使得這三個數的和是 k 的倍數,且這個和最大。資料保證一定有解。1 n 10 5,1 k 10 3,給定的 n 個數均不超過 10 8。輸入格式 第一行包括 2 個正整數 n,k。第二行 n 個正整數,代表給定的 n 個數。輸出格...

藍橋杯 倍數問題

題目描述 眾所周知,小蔥同學擅長計算,尤其擅長計算乙個數是否是另外乙個數的倍數。但小蔥只擅長兩個數的情況,當有很多個數之後就會比較苦惱。現在小蔥給了你 n 個數,希望你從這 n 個數中找到三個數,使得這三個數的和是 k 的倍數,且這個和最大。資料保證一定有解。輸入格式 從標準輸入讀入資料。第一行包括...

藍橋杯2018初賽 倍數問題

題目描述 眾所周知,小蔥同學擅長計算,尤其擅長計算乙個數是否是另外乙個數的倍數。但小蔥只擅長兩個數的情況,當有很多個數之後就會比較苦惱。現在小蔥給了你 n 個數,希望你從這 n 個數中找到三個數 使得這三個數的和是 k 的倍數,且這個和最大。資料保證一定有解。輸入第一行包括 2 個正整數 n,k。第...