母函数一般用来解决组合数问题,很神奇,只是依靠多项式的幂运算就能求出组合数。
没什么可以讲解的,模拟多项式的乘法就行。(让我解决了之前的难题哈哈哈)
hdu 2082 戳这里
这就是一道母函数的模板题了!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
#include<iomanip>
#define MAXN 100010
using namespace std;
#define ll long long int
int coe[1000];
int tempcoe[1000];
int a[26];
int main()
{
int t;
cin>>t;
while(t--)
{
memset(coe,0,sizeof(coe));
memset(tempcoe,0,sizeof(tempcoe));
for(int i=0;i<=25;i++)
cin>>a[i];
for(int i=0;i<=a[0];i++)
tempcoe[i]=1;
for(int i=1;i<26;i++)
{
for(int j=0;j<1000;j++)
for(int k=0;k<=(i+1)*a[i];k+=(i+1))
coe[k+j]+=tempcoe[j];
for(int j=0;j<1000;j++)
tempcoe[j]=coe[j];
memset(coe,0,sizeof(coe));
}
int sum=0;
for(int i=0;i<=50;i++)
sum+=tempcoe[i];
cout<<sum-1<<endl;
}
}
hdu 5616 戳这里
这题难一点,我还是不晓得怎么用map映射。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
#include<iomanip>
#define MAXN 100010
using namespace std;
#define ll long long int
int coe[10000];
int tempcoe[10000];
int a[10000];
int main()
{
int t;
cin>>t;
while(t--)
{
memset(coe,0,sizeof(coe));
memset(a,0,sizeof(a));
memset(tempcoe,0,sizeof(tempcoe));
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
tempcoe[0]=1;
tempcoe[a[0]]=1;
for(int i=1;i<n;i++)
{ //cout<<"1"<<endl;
for(int k=0;k<10000;k++)
for(int j=0;j<=a[i];j+=a[i])
{
coe[k+j]+=tempcoe[k];
coe[abs(k-j)]+=tempcoe[k];
// cout<<"1"<<endl;
}
for(int j=0;j<10000;j++)
tempcoe[j]=coe[j];
memset(coe,0,sizeof(coe));
}
int m;
cin>>m;
for(int i=1;i<=m;i++)
{
int m1;
cin>>m1;
if(tempcoe[m1])
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
}