[HAOI2008]硬币购物
通过观察数据范围,我们可以发现这个题,跑背包我们会T掉。。。
通过观察题目我们可以发现,如果我们跑完全背包,会有许多不合法的方案。。。
辣么,我们就容斥一下好了。。。QAQ。。。
呆码:
#include<iostream> #include<cstdio> #define ll long long using namespace std; int c[6],d[6],n,s; ll f[100010]; int main() { for(int i=1;i<=4;i++) scanf("%d",&c[i]); scanf("%d",&n); f[0]=1; for(int i=1;i<=4;i++) for(int j=c[i];j<=100010;j++) f[j]+=f[j-c[i]]; for(int i=1;i<=n;i++) { for(int j=1;j<=4;j++) scanf("%d",&d[j]); scanf("%d",&s); ll ans=f[s]; for(int j=1;j<=15;j++) { int tmp,k,now=s,g; for(tmp=j,g=1,k=0;tmp;tmp>>=1,g++) if(tmp&1) k^=1,now-=(d[g]+1)*c[g]; if(now>=0) k ? ans-=f[now] : ans+=f[now]; } printf("%lld\n",ans); } }