Codeforces Round #647 (Div. 2) E Johnny and Grandmaster


題目鏈接

http://codeforces.com/contest/1362/problem/E

題目大意

給你一個長度為 n 的數組 K 和 一個整數 P, 讓你將數組 K 分為A 、B兩個集合

使得 ∑ P^KA - ∑ P^KB  的絕對值盡可能的小  

解題思路

我們先考慮如果 p^k 的范圍為 1e9 以內,那么在對 k 從大到小排序后

對於每個數 p^ki 它都是 p 的冪次 , 所以 p^ki 一定會 ≥ p^k(i+1) +...+ p^k(j)

而如果 p^ki < p^k(i+1) ... p^k(j) + p^k(j+1) , 那么 p^ki 就一定會等於 p^k(i+1) ... p^k(j)

所以最優的方案一定是先放入一個數在 a,然后放入 x 個數在 b 

直到集合 b 的和等於集合 a 的和 ,再重新放一個數到 a (重復以上步驟 , 直到用完所有數)

若所有 p^k 的范圍都在 1e9 以內 , 那么我們就可以簡單的掃一遍得出答案

代碼如下 : (把加入集合 a 的當做正數 , 加入集合 b 的當做負數)

int ans = 0;
for(int i = 1 ; i <= n ; i ++)
{
    if(!ans) ans += pow_mod(p , k[i]);
    else ans -= pow_mod(p , k[i]);
}

而當 p^k 的范圍大了之后 , 就需要對它進行取模 

而取完模之后就無法再比較集合a的和 and 集合b的和

不過回到前面的最優方案 , 我們會發現只有當集合a的和等於集合b的和時 ,我們才會把數放入a

其它時候我們都要把數丟進集合 b

而集合 a 的和等於集合 b 的和等價於 sum(a) - sum(b) = 0 

只有當 sum(a) - sum(b) = 0 的時候答案 ans += p ^ ki , 其它時候 ans -= p ^ ki

而 sum(a) - sum(b) 又相當於 ans = 0 , 即我們只要判斷 ans 是否等於 0 即可

因為涉及到了取模 , 所以 ans 等於模數的時候取模完的值也會是0

所以我們可以采取雙模數的方法來判斷 ans 是否等於 0 (有點類似哈希吧?)

AC_Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
const int MOD = 1e9 + 7 , mod = 999998639;
int k[N] , n , p;
int pow_mod(int x , int n , int mod)
{
    int res = 1;
    while(n)
    {
        if(n & 1) res = res * x % mod;
        x = x * x % mod;
        n >>= 1;
    }
    return res;
}
signed main()
{
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while(t --)
    {
        cin >> n >> p;
        for(int i = 1 ; i <= n ; i ++) cin >> k[i];
        sort(k + 1 , k + 1 + n , greater<int>());
        int ans1 = 0 , ans2 = 0;
        for(int i = 1 ; i <= n ; i ++)
        {
            if(!ans1 && !ans2) 
                ans1 += pow_mod(p , k[i] , MOD), 
                ans2 += pow_mod(p , k[i] , mod);
            else
                ans1 = (ans1 - pow_mod(p , k[i] , MOD) + MOD) % MOD,
                ans2 = (ans2 - pow_mod(p , k[i] , mod) + mod) % mod;
        }
        cout << ans1 << '\n';
    }
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM