题目链接:
http://acm.hust.edu.cn/problem/show/1422
题解:
母函数
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const int maxn = 1e4+10;
const int mod =10000007;
int dp1[maxn],dp2[maxn];
int main()
{
int t;
int id=1;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
met(dp1,0);
met(dp2,0);
int x,y;
scanf("%d%d",&x,&y);
int MAX=0,MIN=0;
for(int i=x;i<=y;i++)
dp1[i]=1;
MAX+=y;
MIN+=x;
for(int i=2;i<=n;i++)
{
scanf("%d%d",&x,&y);
for(int k1=MIN;k1<=MAX&&k1<=m;k1++)
{
for(int k2=x;k2<=y&&k1+k2<=m;k2++)
{
dp2[k1+k2]=(dp2[k1+k2]+dp1[k1])%mod;
}
}
MIN+=x;
MAX+=y;
for(int k=MIN;k<=MAX&&k<=m;k++)
{
dp1[k]=dp2[k];
dp2[k]=0;
}
}
printf("Case #%d: ",id++);
printf("%d\n",dp1[m]%mod);
}
}