SDUT 2455 分糖果(容斥原理)

2022-04-06 16:39:22 字數 1010 閱讀 4800

題目鏈結

第一眼看到這個題問題的時候覺得是水dp啊,狀態轉移很容易看出來dp[i][j] = sum(dp[i-1][j-k]) (0<=k<=p),dp[i][j]前i個人,已經分了j個糖果的方案。大約o(n^3)的複雜度,我就交了,果斷tle,然後想了想把列舉k給優化掉,o(n^2)複雜度,目測應該沒有問題了把。。。結果還是tle了,無語,一看資料10000組。。。這個題目正解應該是容斥原理,有一篇**中有提到。

**裡有講解,不過好像太精簡了。。。看了好一會,才能理解。

先考慮n個糖果分給m個人,相當於n個糖果中間插入m-1塊板,所以就是在m+n-1個位置中選m-1個位置,方案數為c[n+m-1][m-1]。然後再考慮去掉,可能存在糖果》p的情況,假設這m個人中有乙個人的糖果數為p+1,還剩下n+m-1-(p+1)糖果,則方案數為c[m][1]*c[n+m-1-(p+1)][m-1],這時會發現有重複的,這個時候就用到容斥原理了。這m種情況(第乙個人有p+1,第二個人有p+1...第m個人有p+1個),想象為m個圓,有多個圓相交,這個相交的部分就是代表有幾個人的糖果數超過了p+1。我們需要求這m個圓的並集,就需要「奇加偶減」,也就是說要把含有奇數個》p糖果的人的方案數加上,再減去偶數個》p糖果的人方案數減去。畫一下圖,有助於理解。。。

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;

6#define mod 1000000007

7long

long c[2001][2001];8

intmain()

919 scanf("

%d",&t);

20while(t--)

2133

if(ans < 0

)34 ans +=mod;

35 printf("

%lld\n

",ans);36}

37return0;

38 }

容斥原理 分糖(SOJ 747)

分糖 題目描述 有 n 個 相同的 糖果,m 個 不同的 小朋友。m 和 n 滿足 1 m n 100000 105 要求 1.每個小朋友都至少有乙個糖果。2.不存在正整數 x x 2 使得每個小朋友的糖果數都是 x 的倍數。3.糖果不能剩餘。求分糖方法總數。答案模 1000000007 109 7...

HDU3388 二分 容斥原理

題目 coprime 題意 給三個數m,n,k,0 思路 二分 容斥原理 由於所找的數與m,n互質,那麼這個數不能含有m,n所包含的素因子。但是k很大,不可能乙個乙個生成。於是二分,找到最小 的x,使得小於或等於x的數中滿足條件的 數的個數大於或等於k,則這個最小值即為答案。在判斷小於或等於x的數中...

POJ 2773 二分 容斥原理

給m k 求與m互質的第k個數 1 m 1000000 k 1 k 100000000 k比較大,對於乙個數n,1到n以內和m互質的數可以通過容斥原理很快算出來,並且隨n遞增 因此二分k就好了 include include include include include includeusing ...