BZOJ1042
2015-08-18 20:13
330 查看
传送门:BZOJ1042
首先,计算出购买面值为i的物品的方案数f(i),这一步强制有序就可以了。
然后,每一次查询时ans=(f(s)-d1溢出方案-d2…+d1d2+d2d3+…-d1d2d3….+d1d2d3d4),即容斥原理。
注意到d1溢出时,至少使用了d1+1个物品,于是剩下S-(d1+1)c1都可以随意分配,于是d1溢出的方案就是f(S-(d1+1)c1)
代码上的小细节见下。
首先,计算出购买面值为i的物品的方案数f(i),这一步强制有序就可以了。
然后,每一次查询时ans=(f(s)-d1溢出方案-d2…+d1d2+d2d3+…-d1d2d3….+d1d2d3d4),即容斥原理。
注意到d1溢出时,至少使用了d1+1个物品,于是剩下S-(d1+1)c1都可以随意分配,于是d1溢出的方案就是f(S-(d1+1)c1)
代码上的小细节见下。
[code]#include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> #include <iostream> using namespace std; long long f[100005]; int n; int c[5]; int W[10]; long long ans; int tot; int d[5],S; void First() { f[0]=1; for(int i=1;i<=4;i++) for(int j=c[i];j<=100000;j++) f[j]+=f[j-c[i]]; } void Dfs(int x,int S,int num) { if(S<0) return; if(num==5){ if(x&1) ans-=f[S]; else ans+=f[S]; return; } Dfs(x+1,S-(d[num]+1)*c[num],num+1); Dfs(x,S,num+1); } void Solve() { for(int i=1;i<=tot;i++){ scanf("%d%d%d%d%d",&d[1],&d[2],&d[3],&d[4],&S); ans=0; Dfs(0,S,1); cout<<ans<<endl; } } void Readdata() { freopen("loli.in","r",stdin); scanf("%d%d%d%d%d",&c[1],&c[2],&c[3],&c[4],&tot); } void Close() { fclose(stdin); fclose(stdout); } int main() { Readdata(); First(); Solve(); Close(); return 0; }
相关文章推荐
- Delphi 在任务栏隐藏程序图标
- leetcode -day31 Subsets I II
- Autofac 的构造函数注入方式
- NBUT 1220 SPY
- 总线设备驱动模型——设备篇
- Unable to execute dex: Multiple dex files define Lorg/ap (
- 如何激活一个window/dialog && 不能直接对Dialog Box使用SetFocus
- [algorithm] graph algorithm
- N-Queens N皇后问题 DFS
- leetcode之路026 Remove Duplicates from Sorted Arrayy
- dinic 模板
- 斯特林数 组合数
- HDU 5399
- Codeforces Gym 100650C The Game of Efil DFS
- Vs2010 配置驱动的开发环境
- iOS视图控制器的跳转方法
- java和javascript双引号嵌套的问题
- 线段树的两种查询方式
- 分词器之NLPIR加密文件在哪
- 微信支付又下一城:可以缴税了