P1450 [HAOI2008] 硬币购物 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题意:
思路:
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
long long c[5],d[5],ans,tot,s,f[100005],k;
signed main()
{
for(int i = 1; i <= 4; i++) scanf("%d",&c[i]); scanf("%d",&tot);
f[0] = 1;
for(int j = 1; j <= 4; j++)
for(int i = 1; i <= 100000; i++)
if(i >= c[j]) f[i] = f[i] + f[i - c[j]];
while(tot--)
{
for(int i = 1; i <= 4; i++) scanf("%d",&d[i]);
scanf("%d",&s);
ans = f[s];
for(int k = 15;k > 0; k--)
{
long long u = 0,o = k,now = 0,cnt = 0;
while(o > 0)
{
cnt++;
if(o & 1)
{
now = (d[cnt] + 1) * c[cnt] + now;
u ^= 1;
}
o >>= 1;
}
if(now > s) continue;
if(u) ans -= f[s - now];
else ans += f[s - now];
}
printf("%lld\n",ans);
}
return 0;
}