母函数

母函数一般用来解决组合数问题,很神奇,只是依靠多项式的幂运算就能求出组合数。
没什么可以讲解的,模拟多项式的乘法就行。(让我解决了之前的难题哈哈哈)
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;
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值