记录编号 128358 评测结果 AAAAAAAAAA
题目名称 [HAOI 2008]硬币购物 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.020 s
提交时间 2014-10-17 14:51:31 内存使用 1.08 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int SIZES=100000;
LL f[SIZES+10]={0};
int c[4];
int sum,d[4];
int cnt(int n){
	int ans=0;
	while(n) ans+=(n&1),n>>=1;
	return ans;
}
LL calc(void){
	LL ans=0;
	for(int t=0;t<16;t++){
		int n=sum;
		for(int i=0;i<4;i++)
			if((t>>i)&1) n-=c[i]*(d[i]+1);
		if(n<0) continue;
		ans+=f[n]*(cnt(t)&1?-1:1);
	}
	return ans;
}
void DP(void){
	f[0]=1;
	for(int i=0;i<4;i++)
		for(int j=c[i];j<=SIZES;j++) f[j]+=f[j-c[i]];
}
int main(){
	freopen("coin.in","r",stdin);
	freopen("coin.out","w",stdout);
	for(int i=0;i<4;i++) scanf("%d",&c[i]);
	DP();
	int T;scanf("%d",&T);
	while(T--){
		for(int i=0;i<4;i++) scanf("%d",&d[i]);
		scanf("%d",&sum);
		printf("%lld\n",calc());
	}
	return 0;
}