inlinevoidInit(){ dp[0]=1; for (registerint i=1;i<=4;++i){ for (registerint j=c[i];j<MAXN;++j){ dp[j]+=dp[j-c[i]]; } } }
简单容斥:
1 2 3 4 5 6 7 8 9 10
for (registerint i=0;i<16;++i){ int f=1,sum=0; for (registerint j=1;j<=4;++j){ if (i&(1<<(j-1))) { f*=-1; sum+=(d[j]+1)*c[j]; } } if (s-sum>=0) ans+=f*dp[s-sum]; }
#include<bits/stdc++.h> #define MAXN 100005 #define int long long usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } int c[5],d[5]; int dp[MAXN]; inlinevoidInit(){ dp[0]=1; for (registerint i=1;i<=4;++i){ for (registerint j=c[i];j<MAXN;++j){ dp[j]+=dp[j-c[i]]; } } } #undef int intmain(){ #define int long long for (registerint i=1;i<=4;++i) c[i]=read(); Init(); int tot=read(); while (tot--){ for (registerint i=1;i<=4;++i) d[i]=read(); int s=read(); int ans=0; for (registerint i=0;i<16;++i){ int f=1,sum=0; for (registerint j=1;j<=4;++j){ if (i&(1<<(j-1))) { f*=-1; sum+=(d[j]+1)*c[j]; } } if (s-sum>=0) ans+=f*dp[s-sum]; } printf("%lld\n",ans); } }