9 30T1 打表證明排序不等式 柯西不等式 逆元

2022-05-01 18:45:09 字數 1390 閱讀 1605

任務

【問題描述】

小a有n個任務,每個任務有一定的價值si

定義乙個三元組(i,j, k)如果三個ijk任務同時被選擇,那麼就會提供

的優美程度

反之,若其中至少有乙個任務沒有被選擇,那麼會提供

的優美程度

現在,小a可以人已決定選擇若干個任務,對於所有的有序可重三元組,他想要知道他能得到的最大優美程度和是多少,以及在最大化優美程度的基礎上,他想知道選擇的任務數量最少是多少

為了避免精度問題,你需要輸出對1000000007取模的值,注意你需要輸出的是最大優美度在mod意義下的值,不是最大模意義下的優美程度

【輸入】

輸入包括三行

第一行是乙個數字n,表示任務總共的任務數量

第二行包括n個書,第 i 個數字si表示每個任務的價值

【輸出】 

第一行是最大優美程度

第二行是選擇的任務數量

【樣例輸入】

1 2 3

【樣例輸出】

【資料範圍】

對於10%的資料,保證n<=5

對於40%的資料,保證n<=10

對於70%的資料,保證n<=500

對於100%的資料,保證n<=10000000,1<=si<=n

首先我們要比較兩個式子,根據柯西不等式變換可以得到以下證明

(word敲公式真tm麻煩)

那麼任務就要選一定都要選才會是最大

那麼我們再看取等號的條件實際上是所有的數字都相等,當這個時候乾脆什麼都不取,滿足了最大同時最少

那麼計算的時候我們要展開分開求和

原始展開拆成兩個部分

code:

1 #include2 #include3

#define n 10000005

4using

namespace

std;

5long

long

inv[n],suminv[n],sumsq[n],sum[n];

6long

long

a[n];

7const

long

long mod=1e9+7

;8 inline void pre(long

long

n)13}14

intmain()29}

30long

long ans=((3*n*n)%mod*sum[n])%mod+(6*n)%mod*suminv[n]%mod*(sumsq[n]%mod)%mod;

31 cout

32if(flag)cout<

33else cout<<0

;34 }

over

NOIP模擬(10 19)T1 打牌

打牌 題目背景 10.19 noip 模擬t1 分析 dp or 貪心 本喵表示,這種小資料死都拍不出錯,大資料隨隨便便就錯的題,我也是喵了個咪的 打了對拍,打了暴力,然後拍了幾個小時,卵用 不吐槽了,本喵今天這個題只有 30分 貪心錯成智障 然後,標算還是貪心,首先我們知道出對子肯定更加好,我們直...

fjwc2019 D6T1 堆(組合數 打表)

193.2019冬令營提高組 堆 但是每個點都遍歷一遍,有些點的子樹完全相同卻重複算了 忽然記起完全二叉樹的性質之一 每個非葉節點的子樹中至少有乙個是滿二叉樹 那麼我們預處理滿二叉樹的那一塊,剩下的dfs就可以辣 求階乘.分塊打表 設打表分成 k 段,則複雜度 o logn n k includec...

7 24校內交流賽 T1 T2

乙個腦洞很大的題,將輸入的所有數異或起來輸出就好了 話說我為什麼這麼喜歡用異或啊 結論題 當某個字串長度恰巧為3 k 1時,從它往下的第3 k 1行恰好只決定於這個字串的左右兩個端點的值 includeusing namespace std inline intread intn,l char a ...