容斥原理
f ( S ) = ∑ T ⊆ S g ( T ) g ( S ) = ∑ T ⊆ S ( − 1 ) ∣ S ∣ − ∣ T ∣ f ( T ) f(S)=\sum_{T \subseteq S} g(T) \\ g(S)=\sum_{T \subseteq S}(-1)^{|S|-|T|} f(T) f(S)=T⊆S∑g(T)g(S)=T⊆S∑(−1)∣S∣−∣T∣f(T)
母函数求组合数
题目
HDU 2082
直接把不同字母的多项式相乘就行,模板题
如只有2个a,3个c,1个g
(
x
0
+
x
1
+
x
2
)
(
x
0
+
x
3
+
x
6
+
x
9
)
(
x
7
)
(x^0+x^1+x^2)(x^0+x^3+x^6+x^9)(x^7)
(x0+x1+x2)(x0+x3+x6+x9)(x7)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int num[30]; // 每个字母的数量
ll sup[55];
ll tmp[55];
int main(){
int T;
cin>>T;
while(T--){
for(int i=1;i<=26;++i){
cin>>num[i];
if(num[i]*i>50)num[i]=50/i;
}
memset(tmp,0,sizeof(tmp));
memset(sup,0,sizeof(sup));
sup[0] = 1;
for(int i=1;i<=26;++i){
for(int j=0;j<=num[i];++j){
for(int k=0;j*i+k<=50;++k){
tmp[j*i+k] += sup[k];
}
}
for(int j=0;j<=50;++j){
sup[j] = tmp[j];
tmp[j] = 0;
}
}
ll ans = 0;
for(int i=1;i<=50;++i)
ans += sup[i];
cout<<ans<<endl;
}
}