既然没人写扩欧,那我就来一发吧。

扩欧也还好,就是跑的有点慢,然后写的时候还有点烦,不过还是卡过去了。

考场上看到这道题又蒙了。。。
怎么回事第一题又要爆零了?

然后我打了个暴力测了一下极限数据根本过不去(幸好没把电脑整死机)

于是想了又想,整出了个 $ O(s* t)$的扩欧算法(打了一个小时的样子)。

(话说正解好像容斥)

原本搞了下循环展开结果好像会更慢。。。


讲一下思路:用扩欧解。

安利扩欧博客:Judge's Class

  预处理解之前我们要先用扩欧求出:
  c1*x + c2*y = gcd(c1,c2) 中的 x和y (以及gcd),记录下来,
  然后 c1、c2 除以 gcd(c1,c2)。(会扩欧的话就能懂吧。)
  然后我们先 O(s log s) 预处理用 c1、c2 能拼出 s 的解。
  (即 c1*x1 + c2*y1 = s 中 x1和y1 的解)
  然后我们令 x1 达到最小正整数状态,即 y1 达到最大解。
  这时如果 y1 为负数,则无解,将数组中的值设为-1,break。
  否则我们用数组记录下此时的解。

  那么 c3、c4 也是同理这样处理。

  这样处理完之后我们发现如果没有 d 数组的限制,y/c2 就是方案数,
  那么我们考虑一下 d1对x1 的限制 以及 d2 对 y1 的限制求出解的方案数。
  然后记录答案在 f 数组里面,至于 c3、c4 就记录进 g 数组。
  然后 O(s) 滚出答案。

 //by Judge
#include<bits/stdc++.h>
#define rint register int
#define ll long long
using namespace std;
const int M=1e5+;
#idndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[<<],*p1,*p2;
inline int read(){ int x=,f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-''; return x*f;
} int c1,c2,c3,c4,d1,d2,x11,x22,y11,y22,d[];
int X1[M],X2[M],Y1[M],Y2[M],f[M],g[M];
int ex_gcd(int a,int b,int& x,int& y){ /* 套个板子,忘了就现推 */
if(!b) return x=,y=,a;
int d=ex_gcd(b,a%b,y,x);
return y-=a/b*x,d;
}
int main(){
c1=read(),c2=read();
c3=read(),c4=read();
d1=ex_gcd(c1,c2,x11,y11);
d2=ex_gcd(c3,c4,x22,y22);
c1/=d1,c2/=d1,c3/=d2,c4/=d2;
/* 预处理出解 */
for(rint s=;s<=1e5;++s){
rint tmp=s,x=x11,y=y11;
rint a=c1,b=c2;
if(tmp%d1){
X1[s]=Y1[s]=-;
continue;
}
tmp/=d1,x*=tmp,y*=tmp; y+=x/b*a,x%=b;
if(x<) x+=b,y-=a;
if(y>=) X1[s]=x,Y1[s]=y;
else X1[s]=Y1[s]=-;
}
for(rint s=;s<=1e5;++s){
rint tmp=s,x=x22,y=y22;
rint a=c3,b=c4;
if(tmp%d2){
X2[s]=Y2[s]=-;
continue;
}
tmp/=d2,x*=tmp,y*=tmp; y+=x/b*a,x%=b;
if(x<) x+=b,y-=a;
if(y>=) X2[s]=x,Y2[s]=y;
else X2[s]=Y2[s]=-;
}
for(rint T=read(),S;T;--T){
ll ans=;
for(int i=;i<=;++i)
d[i]=read();
S=read(),f[]=g[]=;
/* 考虑限制求出方案数 */
for(rint s=;s<=S;++s){
rint tmp=s,a=c1,b=c2;
rint x=X1[s],y=Y1[s];
if(x<||y<){
f[s]=;
continue;
}
rint maxX=min(x+y/a*b,d[]); if(d[]<y) x+=(y-d[]+a-)/a*b;
if(x>maxX){
f[s]=;
continue;
}
f[s]=(maxX-x)/b+;
}
for(rint s=;s<=S;++s){
rint tmp=s,a=c3,b=c4;
rint x=X2[s],y=Y2[s];
if(x<||y<){
g[s]=;
continue;
}
rint maxX=min(x+y/a*b,d[]); if(d[]<y) x+=(y-d[]+a-)/a*b;
if(x>maxX){
g[s]=;
continue;
}
g[s]=(maxX-x)/b+;
}
/* O(s) 滚出答案 */
for(rint i=;i<=S;++i)
ans+=1ll*f[i]*g[S-i];
printf("%lld\n",ans);
} return ;
}

【HAOI2008】硬币购物的更多相关文章

  1. Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1747  Solved: 1015[Submit][Stat ...

  2. bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理

    题目链接 1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1706  Solved: 985[Submit][ ...

  3. BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )

    先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ...

  4. BZOJ 1042: [HAOI2008]硬币购物 [容斥原理]

    1042: [HAOI2008]硬币购物 题意:4种硬币.面值分别为c1,c2,c3,c4.1000次询问每种硬币di个,凑出\(s\le 10^5\)的方案数 完全背包方案数? 询问太多了 看了题解 ...

  5. BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包

    BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包 题意: 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s i的价值 ...

  6. P1450 [HAOI2008]硬币购物(完全背包+容斥)

    P1450 [HAOI2008]硬币购物 暴力做法:每次询问跑一遍多重背包. 考虑正解 其实每次跑多重背包都有一部分是被重复算的,浪费了大量时间 考虑先做一遍完全背包 算出$f[i]$表示买价值$i$ ...

  7. 【BZOJ】1042: [HAOI2008]硬币购物

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3307  Solved: 2075[Submit][Stat ...

  8. BZOJ1042 [HAOI2008]硬币购物 【完全背包 + 容斥】

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2924  Solved: 1802 [Submit][St ...

  9. 【BZOJ1042】[HAOI2008]硬币购物 容斥

    [BZOJ10492][HAOI2008]硬币购物 Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值 ...

  10. BZOJ 1042: [HAOI2008]硬币购物 容斥+背包

    1042: [HAOI2008]硬币购物 Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请 ...

随机推荐

  1. UDP中的sendto 与recvfrom

    sendto 头文件: #include <sys/types.h>   #include <sys/socket.h> 定义函数: int sendto(int s, con ...

  2. python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原

    ###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...

  3. 【关键字】c++关键字

    1. alignas (c++11) 设置类和struct的字节对齐方式 默认取值是:  2n : 0, 1, 2, 4 , 6, 8..... 2. alignof 区分sizeof(), alig ...

  4. PhotoshopCC2018安装流程以及破解

    2018版增加了不少功能,也对优化PS软件进行了不少的优化,界面更加简洁美观 这里以64位为主. 1.首先下载好PhotoshopCC安装包和破解包,分别解压 2.解压完毕后,在安装包里面双击Setu ...

  5. Ubuntu swap

    问:我是一个Ubuntu 14.04 LTS版本的新手.我需要一块额外的swap文件来提高我Ubuntu服务器的性能.我怎样才能通过SSH连接用相关命令为我的Ubuntu 14.04 LTS 增加一块 ...

  6. 苹果手机上点击WEUI日期控件不容易点中

    主要问题是WEUI cells有Padding,而苹果手机一般屏幕较小,容易点不中导致的 <div class='weui_cell' style="padding-bottom:0p ...

  7. 【十四】jvm 性能调优实例

    实例1: POI Excel 导出 Excel对象很大,多人同时登录系统导出Excel的话,就会有多个大Excel对象到老年代,这是老年代需要回收,系统可能会卡顿. jvm堆内存设置的越大,Full ...

  8. 数据库设计理论与实践·<四>数据库基本术语及其概念

    一.关系模型 关系模型是最重要的一种数据模型.关系数据库模型系统采用关系模型作为数据的组织方式. 关系模型的数据结构: 关系:一张表 元组:一行记录. 属性:一列 [码(键,key)]:表中的某个属性 ...

  9. JQuery之Attr()与Prop()方法

    一.Prop()的由来 JQuery 1.6开始 新增方法prop() prop()解决:表单元素中checked,selected,disabled等属性在方法attr()中可能会出现的不一致问题( ...

  10. Codeforces Round #536 (Div. 2)

    前言 如您所见这又是一篇咕了的文章,直接咕了10天 好久没打CF了 所以还是个蓝名菜鸡 机房所有人都紫名及以上了,wtcl 这次前4题这么水虽然不知道为什么花了1h,结果不知道为什么搞到一半出锅了,后 ...