bzoj4559 JLOI2016 成績比較

2022-03-25 05:27:30 字數 2400 閱讀 6413

time limit:20 secmemory limit:256 mbg系共有n位同學,m門必修課。這n位同學的編號為0到n-1的整數,其中b神的編號為0號。這m門必修課編號為0到m-1的整數。一位同學在必修課上可以獲得的分數是1到ui中的乙個整數。如果在每門課上a獲得的成績均小於等於b獲得的成績,則稱a被b碾壓。在b神的說法中,g系共有k位同學被他碾壓(不包括他自己),而其他n-k-1位同學則沒有被他碾壓。d神查到了b神每門必修課的排名。這裡的排名是指:如果b神某門課的排名為r,則表示有且僅有r-1位同學這門課的分數大於b神的分數,有且僅有n-r位同學這門課的分數小於等於b神(不包括他自己)。我們需要求出全系所有同學每門必修課得分的情況數,使其既能滿足b神的說法,也能符合d神查到的排名。這裡兩種情況不同當且僅當有任意一位同學在任意一門課上獲得的分數不同。你不需要像d神那麼厲害,你只需要計算出情況數模10^9+7的餘數就可以了。

第一行包含三個正整數n,m,k,分別表示g系的同學數量(包括b神),必修課的數量和被b神碾壓的同學數量。第二行包含m個正整數,依次表示每門課的最高分ui。第三行包含m個正整數,依次表示b神在每門課上的排名ri。保證1≤ri≤n。資料保證至少有1種情況使得b神說的話成立。n<=100,m<=100,ui<=10^9

僅一行乙個正整數,表示滿足條件的情況數模10^9+7的餘數。

3 2 1

2 21 210容斥原理+組合數,思路好

wangyuzee的題解很棒,orz

整體思路:先求出所有其他人和b神每門課分數相對大小的不同方案數,然後再計算每門課的方案數,兩者乘積即為答案。

①先算第一部分,直接算比較難,考慮容斥原理。

f[i]表示有i個人被碾壓的方案數,則f[i]=c(n-1,i)*c(n-1-i,rnk[1]-1)*c(n-1-i,rnk[2]-1)*…*c(n-1-i,rnk[m]-1)-f[i+1]*c(i+1,i)-f[i+2]*c(i+2,i)-…-f[n-1]*c(n-1,i),即用至少i個人被碾壓的方案數減去不合法的。f陣列逆向遞推即可求出。

②再算第二部分,對於每一門分別計算,然後乘起來。

假設某一門課的總分為s,b神的名次和分數分別為rnk和x,則方案數為x^(n-rnk)*(s-x)^(rnk-1)。

展開化簡得∑ c(rnk-1,i)*s^(rnk-1-i)*x^(n-rnk+i),0≤i≤rnk-1。

我們要對x=1,2,…,s的所有情況求和。

把x次數相同的項放在一起,轉化成求1^p+2^p+...+s^p,p為常數。

設g[i]=1^i+2^i+...+s^i,然後觀察規律:

(s+1)^(p+1)-s^(p+1)=c(p+1,0)*s^0+c(p+1,1)*s^1+…+c(p+1,p)*s^p

s^(p+1)-(s-1)^(p+1)=c(p+1,0)*(s-1)^0+c(p+1,1)*(s-1)^1+…+c(p+1,p)*(s-1)^p

2^(p+1)-1^(p+1)=c(p+1,0)*1^0+c(p+1,1)*1^1+…+c(p+1,p)*1^p

將式子相加,得:(s+1)^(p+1)-1=c(p+1,0)*g[0]+c(p+1,1)*g[1]+…+c(p+1,p)*g[p]

移項,得:g[p]=((s+1)^(p+1)-1-c(p+1,0)*g[0]-c(p+1,1)*g[1]-…-c(p+1,p-1)*g[p-1]) / c(p+1,p)

於是可以通過正向遞推求出g陣列。

這樣,這個問題就完美解決了,時間複雜度o(n^3)。

#include

#include

#include

#include

#include

#include

#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define n 105

#define mod 1000000007

using namespace std;

int n,m,k;

ll ans,s[n],rnk[n],fac[n],inv[n],f[n],g[n];

inline int read()

while (ch>='0'&&ch<='9')

return x*f;

}inline ll getpow(ll x,ll y)

inline ll c(int x,int y)

int main()

ans=1;

f(i,1,m)

ll tmp=0,p=1;

f(j,0,rnk[i]-1) tmp=(tmp+c(rnk[i]-1,j)*getpow(s[i],rnk[i]-1-j)%mod*g[n-rnk[i]+j]%mod*p+mod)%mod,p=-p;

ans=ans*tmp%mod;

} cout<

BZOJ 4559 成績比較

題意 sol 第一眼看起來就是個稍微麻煩的組合數 但是發現如果欽點哪些同學分數在某科目上分數比b神低以後的方案,就會出現沒有被欽 點碾壓的同學也會被碾壓,後面欽點分數時可能欽點的一直是同一批人導致人數不夠不被碾壓的人數 於是可以考慮容斥,用至少i ii個人的方案算出恰好k kk個人的方案。可以得到 ...

BZOJ 4559 成績比較

題意 sol 第一眼看起來就是個稍微麻煩的組合數 但是發現如果欽點哪些同學分數在某科目上分數比b神低以後的方案,就會出現沒有被欽 點碾壓的同學也會被碾壓,後面欽點分數時可能欽點的一直是同一批人導致人數不夠不被碾壓的人數 於是可以考慮容斥,用至少 i 個人的方案算出恰好 k 個人的方案。可以得到 因為...

BZOJ 2764 JLOI2011 基因補全

題目 題意 給定乙個長度為n的鹼基序列s和乙個長度為m的鹼基序列t,現在希望向序列t裡補一定的鹼基使得序列s和序列t配對,配對的規則是a與t配對,c與g配對,新增鹼基的位置與數量不同的方案視為不同,求不同的方案數。0n 2000 題解 可以考慮算出序列t在序列s裡匹配的本質不同方案數,利用dp可以很...