F - Valid payments

简化题意:有\(n\)种面值的货币,保证\(a[1]=1,且a[i+1]是a[i]的倍数\)。

有一个价格为\(x\)元的商品,付款\(y\)元,找零\(y-x\)元。

问满足以下条件的情况下的应支付金额\(y\)有多少种?

条件一:付款和找零都使用最少的硬币数量。

条件二:在满足条件一的情况下,付款是用过的硬币面值,找零时无法使用。

考虑这个题对于条件一而言,可以归结为第\(i\)个硬币食用的个数不能超过\(a[i+1]/a[i]\),否则的话我们直接使用\(a[i+1]\)会更优。这样的话在条件一的情况下,每个金额\(x\)都有唯一的表示方法:\(x=k_{x1}*a_1+k_{x2}*a_2+k_{x3}*a_3+...+k_{xn}*a_n\),这样的话我们令\(b=y-x\),则对于条件二而言限制条件就变成了\(k_{yi}和k_{bi}\)不能同时非零,即不能同时使用。

这样的话我们可以列出以下等式:

\(x=k_{x1}*a_1+k_{x2}*a_2+...+k_{xn}*a_n\)

\(+b=k_{b1}*a_1+k_{b2}*a_2+...+k_{bn}*a_n\)

\(y=k_{y1}*a_1+k_{y2}*a_2+...+k_{yn}*a_n\)

限制条件如下:\(k_i不能超过a[i+1]/a[i]\),且\(k_{yi}\)和\(k_{bi}\)不能同时非零。问不同的\(y\),或\(b\)的方案数?(可以发现\(y\)和\(b\)是一一对应的。)

由于\(k_{yi}\)和\(k_{bi}\)不能同时非零,则至少一个为\(0\),所以我们直接分类讨论就行:

1.若\(k_{yi}\)为0,则说明我们这里\(k_{xi}\)和\(k_{bi}\)相加的和必须也为0,但这怎么可能呢?考虑会不会是进位的问题呢?什么意思就是我的\(k_{xi}\)和\(k_{bi}\)都不超过\(a[i+1]/a[i]\)但我的和却超过它了,这样的话就可以用前面的替代了。那么这样的话也就是必须满足\(k_{xi}+k_{bi}+上一位的进位=a[i+1]/a[i]\).这样的话才能满足当前位为\(0\).

2.若\(k_{bi}\)为0,说明\(x_{ki}+上一位的进位=y_{ki}\)。

也就是说只要我们知道上一位是否进位,我们就可以根据当前\(x_{ki}\)来确定当前不同情况下的y和b了。具体的就是我们设\(dp[i][0/1]\)表示前\(i\)位,并且第\(i\)位进位/不进位的方案数。

则根据情况二有:\(dp[i][0]+=dp[i-1][0],dp[i][0]+=dp[i-1][1](k_{xi}!=a[i+1]/a[i]-1)\)

根据情况一有:\(dp[i][1]+=dp[i-1][1],dp[i][1]+=dp[i-1][0](k_{xi}!=0)\)。

由于金额最大的没有限定的使用数量,但我们发现\(k_{bn}\)只能为0.

//不等,不问,不犹豫,不回头.
#include<bits/stdc++.h>
#define _ 0
#define ls p<<1
#define db double
#define rs p<<1|1
#define P 1000000007
#define ll long long
#define INF 1000000000
#define get(x) x=read()
#define PLI pair<ll,int>
#define PII pair<int,int>
#define ull unsigned long long
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define rep(x,y,z) for(int x=y;x<=z;++x)
#define fep(x,y,z) for(int x=y;x>=z;--x)
#define go(x) for(int i=link[x],y=a[i].y;i;y=a[i=a[i].next].y)
using namespace std;
const int N=110;
ll n,x,a[N],mx[N],kx[N],dp[N][2]; inline ll read()
{
ll x=0,ff=1;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*ff;
} int main()
{
//freopen("1.in","r",stdin);
get(n);get(x);
rep(i,1,n) get(a[i]);
rep(i,1,n-1) mx[i]=a[i+1]/a[i];
fep(i,n,1)
{
if(x>=a[i])
{
kx[i]=x/a[i];
x-=kx[i]*a[i];
}
}
dp[0][0]=1;
rep(i,1,n)
{
dp[i][0]+=dp[i-1][0];
dp[i][1]+=dp[i-1][1];
if(kx[i]!=mx[i]-1) dp[i][0]+=dp[i-1][1];
if(kx[i]!=0) dp[i][1]+=dp[i-1][0];
}
putl(dp[n][0]);
return (0^_^0);
}
//以吾之血,铸吾最后的亡魂.

AtCoder Beginner Contest 182 F的更多相关文章

  1. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  2. AtCoder Beginner Contest 261 F // 树状数组

    题目链接:F - Sorting Color Balls (atcoder.jp) 题意: 有n个球,球有颜色和数字.对相邻的两球进行交换时,若颜色不同,需要花费1的代价.求将球排成数字不降的顺序,所 ...

  3. AtCoder Beginner Contest 260 F - Find 4-cycle

    题目传送门:F - Find 4-cycle (atcoder.jp) 题意: 给定一个无向图,其包含了S.T两个独立点集(即S.T内部间的任意两点之间不存在边),再给出图中的M条边(S中的点与T中的 ...

  4. AtCoder Beginner Contest 253 F - Operations on a Matrix // 树状数组

    题目传送门:F - Operations on a Matrix (atcoder.jp) 题意: 给一个N*M大小的零矩阵,以及Q次操作.操作1(l,r,x):对于 [l,r] 区间内的每列都加上x ...

  5. AtCoder Beginner Contest 249 F - Ignore Operations // 贪心 + 大根堆

    传送门:F - Keep Connect (atcoder.jp) 题意: 给定长度为N的操作(ti,yi). 给定初值为0的x,对其进行操作:当t为1时,将x替换为y:当t为2时,将x加上y. 最多 ...

  6. AtCoder Beginner Contest 247 F - Cards // dp + 并查集

    原题链接:F - Cards (atcoder.jp) 题意: 给定N张牌,每张牌正反面各有一个数,所有牌的正面.反面分别构成大小为N的排列P,Q. 求有多少种摆放方式,使得N张牌朝上的数字构成一个1 ...

  7. AtCoder Beginner Contest 133 F Colorful Tree

    Colorful Tree 思路: 如果强制在线的化可以用树链剖分. 但这道题不强制在线,那么就可以将询问进行差分,最后dfs时再计算每个答案的修改值, 只要维护两个数组就可以了,分别表示根节点到当前 ...

  8. AtCoder Beginner Contest 171-175 F

    171 F - Strivore 直接把初始字符当成隔板,统计的方案数会有重复 为了避免重复情况,规定隔板字母尽可能最后出现,即在隔板字母后面不能插入含隔板字母的字符串 所以在隔板字母后插入的字符只有 ...

  9. AtCoder Beginner Contest 215 F题题解

    F - Dist Max 2 什么时候我才能突破\(F\)题的大关... 算了,不说了,看题. 简化题意:给定\(n\)个点的坐标,定义没两个点的距离为\(min(|x_i-x_j|,|y_i-y_j ...

随机推荐

  1. Webpack的配置项

    Webpack配置选项 ​ 经历了考研以后,接下来的时间里准备捡起来这些以前学的东西,并且继续向着前端的方向出发,给自己多一条路的选择.话不多说,直接开始. moudule.exports = { / ...

  2. javascript 函数节流 throttle 解决函数被频繁调用、浏览器卡顿的问题

    * 使用setTimeout index.html <html> <head> <meta charset="UTF-8"> <title ...

  3. nginx负载轮询

    下面是一个可以使用nginx负载轮询,如果有一台服务器连接不通,返404,500,502,503,504,会自动切换到下一台服务器 upstream www { server 111.111.111. ...

  4. 使用亚马逊服务器报错:Signature not yet current: 20190726T070253Z is still later than 20190726T070246Z (20190726T065746Z + 15 min.)时间不同步的解决办法

    1.首先获取亚马逊的时间: $ curl http://s3.amazonaws.com -v 2.更改当前服务器时间,使之与亚马逊时间同步 $ date -s 'xxxx-xx-xx xx:xx:x ...

  5. 华为云计算IE面试笔记-华为云计算解决方案业务迁移支持哪些迁移?有哪些特点?请描述基本的业务交付流程、业务迁移流程和原则。

    1. 迁移场景:华为云计算解决方案按照源端环境来说,支持P2V.V2V(P2V:物理设备(操作系统及其上的应用软件和数据)迁移到华为虚拟化平台.V2V:其他厂商的虚拟化平台迁移到华为虚拟化平台.)以及 ...

  6. Ubuntu开发相关环境搭建

    一.Ubuntu系统语言环境切换修改 安装时,选择的中文版,但实际使用起来,很不爽,果断切换为英文 1.1 打开终端: vim /etc/default/locale 1.2 修改配置 LANG=&q ...

  7. Fortran学习笔记:01 基本格式与变量声明

    Fortran学习笔记目录 01 基本格式与变量声明 格式 固定格式(Fixed Format):Fortran77 程序需要满足一种特定的格式要求,具体形式参考教材 自由格式(Free Format ...

  8. mysql数据备份及恢复详细操作

    一.数据库数据备份 1.全备 BakDir=/backup/full #创建全备目录 LogFile=/backup/full/bak.log #创建备份日志 Date=`date +%Y%m%d` ...

  9. 中国唯一入选 Forrester 领导者象限,阿里云 Serverless 全球领先

    3 月 26 日消息,权威咨询机构 Forrester 发布 2021 年第一季度 FaaS 平台评估报告,阿里云函数计算凭借在产品能力.安全性.战略愿景和市场规模等方面的优势脱颖而出,产品能力位列全 ...

  10. Java基础之(六):变量、运算符与JavaDoc

    变量.常量 一.变量的命名规范 首字母只能以字母(A-Z或者a-z)或者美元符($)或者下划线(_)开头,不能以数字开头,首字母之后只能跟字母(AZ或者az)或者数字,不能跟美元符或者下划线 源码 p ...