2017提高组D1T1 洛谷P3951 小凯的疑惑
洛谷P3951 小凯的疑惑
题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有 无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。
输入输出格式
输入格式:
两个正整数 a 和 b,它们之间用一个空格隔开,表示小凯中金币的面值。
输出格式:
一个正整数 N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。
输入输出样例
输入样例#1:
3 7
输出样例#1:
11
说明
【输入输出样例 1 说明】
小凯手中有面值为3和7的金币无数个,在不找零的前提下无法准确支付价值为1,2,4,5,8,11 的物品,其中最贵的物品价值为 11,比11 贵的物品都能买到,比如:
【数据范围与约定】
小学奥数法
运用公式a*x+b*y=k,max(k)=a*b-a-b
我对小奥一窍不通,更别说什么同余那些东西了
我的理解:假设两种钱每种最少要拿一次(也就是不能不拿),不能凑成的最小钱数为k,因为a和b互质,显然,k = a * b,(当k = a * b 时,由于ab互质,要么a拿b个,要么b拿a个)。 由于a和b可以一样都不拿,所以ans = k - a - b = a * b - a - b吧。。。
感觉貌似有那么点道理
2019-07-16 21:05:54更新
今天我在回顾博客园时,问了大佬一个问题:我写的对了吗?
突然自己都发现有问题
原本的题解,貌似是当时看懂了一位大佬后,照搬过来的呢。。。
有点bug,比如说k的定义?
不能凑成的最小钱数为k
既然不能凑成,那么哪来的k=a*b?
所以,旧东西有些是要检查,然后舍弃的呢!
看看能不能开学后问问老板吧
更新完毕
不过还是看具体公式推导吧
其实,这道题目是一道数学定理——赛瓦维斯特定理:已知a,b为大于1的正整数,(a,b)=,则使不定方程ax+by=Cax+by=C无负整数解的最大整数C=ab−a−bC=ab−a−b! 证明:
若存在x,y>=0x,y>=0满足 ax+by=ab−a−bax+by=ab−a−b 则a(x+)+b(y+)=aba(x+)+b(y+)=ab
于是a|(y+)a|(y+),b|(x+)b|(x+)
(a(x+)=b(a−y−)a(x+)=b(a−y−),有 a,b互质,所以b|(x+)b|(x+)。a|(y+)a|(y+)同理)
又x+>=,y+>=1x+>=,y+>=
故a(x+)+b(y+)>=a∗b+b∗a=2aba(x+)+b(y+)>=a∗b+b∗a=2ab (因为b|(x+)b|(x+),所以b<=x+1b<=x+,同理a<=y+1a<=y+)
但是在上述假设中我们知道a(x+)+b(y+)=aba(x+)+b(y+)=ab,a>=,b>=0a>=,b>=
所以假设不成立,即不存在x,y>=0x,y>=,满足 ax+by=ab−a−bax+by=ab−a−b 对于任意正整数C>=ab−a−b+1C>=ab−a−b+,即C+a+b>=ab+1C+a+b>=ab+
设C+a+b=ka+m(k>=b,<=m<=a−)C+a+b=ka+m(k>=b,<=m<=a−)
注意到(a,b)=
由裴蜀定理,知存在x0,y0∈Zx0,y0∈Z,使得ax0+by0=1ax0+by0=
故存在x1,y1∈Z,−(b−)<=x1<=−1x1,y1∈Z,−(b−)<=x1<=−
使得ax1+by1=max1+by1=m
(解释一下,这里的意思其实是设−(b−)<=x1<=−−(b−)<=x1<=−,一定存在整数y1y1使得ax1+by1=max1+by1=m成立。原因就是在整数x1x1的取值中一共有b−1b−1个数,y1=(m−ax1)/by1=(m−ax1)/b,总是可以找到x1x1使得m−ax1m−ax1能被b整除)
显然,y1>=(ax1<,m>,b>0y1>=(ax1<,m>,b>,因此y1>=1y1>=)
于是,取x=k+x1−,y=y1−1x=k+x1−,y=y1−
注意到x1,y1x1,y1的取值范围,得x,y>=0x,y>=
得ax+by=Cax+by=C
所以任意C>=ab−a−b+1C>=ab−a−b+1都存在x,y>=0x,y>=,ax+by=Cax+by=C
证毕
具体公式推导
代码如下:
//AC
//luoguP3951小凯的疑惑
#include<iostream>
using namespace std;
int main()
{
long long a,b;
cin>>a>>b;
cout<<a*b-a-b;
return ;
}
暴力法
简单粗暴的枚举,但是枚举量无疑是巨大的。每个枚举量的最大值都是a*b(根据上面推理的公式,且题目中给出a,b互质,说明结果一定会小于a*b)。逐一舍去可以被表示出来的数字(赋予1),最后再倒序从a*b-1开始输出第一个为零的数字
还有地方需优化
//60分
//luoguP3951小凯的疑惑
#include<iostream>
using namespace std;
bool number[];
int main()
{
long long a,b;
cin>>a>>b;
for(long long i=;i*a<a*b;i++)
for(unsigned long long j=;j*b<a*b;j++)
{
if(i*a+j*b>a*b) break;
number[i*a+j*b]=;
}
for(long long i=a*b-;i>;i--)
if(number[i]==) {cout<<i;break;}
return ; }
暴力法
之后,我下载了#13测试数据:66650775 6074462
对应的答案:404867527282813
你就知道为什么会不能通过了——超时
第三种方法
被启发 by 我的好室友NLH
因为对于每一个可以得到的商品的价格,再加上a或b,小凯也可以买到。那么每一个数字就有两种选择,直到数字超过了a*b。
不过,想法十分巧妙效果一般
还有地方需改进
//30分
//luoguP3951小凯的疑惑
#include<iostream>
using namespace std;
unsigned long long a,b;
bool number[];
void function(unsigned long long one){
if(one>a*b) return;
number[one]=;
//cout<<one<<endl;//倘若你输出每一次的one值,你就可以看到效率是多么的低。。。
function(one+a);
function(one+b);
}
int main()
{
cin>>a>>b;
function();
for(unsigned long long i=a*b-;i>;i--)
if(number[i]==) {cout<<i;break;}
return ;
}
第三种方法
总结
总而言之,还是第一种方法好,没有任何的循环等等。。。
但它也是最难理解的一种。
做这种题时,要好好想想有没有更简单的方法,其次是数学基本功底要好。
再接再厉!
好的,那就先这么草率的结束了吧!
2017提高组D1T1 洛谷P3951 小凯的疑惑的更多相关文章
- 洛谷 P3951 小凯的疑惑 找规律
目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例: 输出样例: 说明 思路 证明 AC代码 include<bits/stdc++.h> 题面 ...
- 洛谷P3951 小凯的疑惑 - 数学 /扩展欧几里得
传送门 题意:求出a和b不能通过线性组合(即n*a+m*b)得到的最大值: 思路:摘自洛谷: 不妨设 a<b 假设答案为 x 若 x≡m*a ( mod b )(1≤m≤b−1) (mod3)什 ...
- 洛谷 P3951 小凯的疑惑(数学)
传送门:Problem P3951 https://www.cnblogs.com/violet-acmer/p/9827010.html 参考资料: [1]:http://m.blog.sina.c ...
- 洛谷 P3951 小凯的疑惑
题目链接 一开始看到这题,我的内心是拒绝的. 以为是同余类bfs,一看数据1e9,发现只能允许O(1)的算法,数学还不太好,做不出来,其实应该打表找规律. 看到网上的题解,如果两个都必须拿,结果一定是 ...
- 2017普及组D1T3 洛谷P3956 棋盘
2017普及组D1T3 洛谷P3956 棋盘 原题 题目描述 有一个m×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在 ...
- P3951 小凯的疑惑
P3951 小凯的疑惑 题解 题意也就是求解不能用 ax+by 表示的最大数 ans(a,b,x,y,都是正整数) 给定 a ( =7 ) , b ( =3 ) 我们可以把数轴非负半轴上的数按照a的 ...
- 题解 P3951 小凯的疑惑
P3951 小凯的疑惑 数论极菜的小萌新我刚看这题时看不懂exgcd做法的题解,后来在网上找到了一篇博客,感觉代码和推导都更加清新易懂,于是在它的基础上写了题解qwq 分析 两数互质,且有无限个,想到 ...
- 2021.07.20 P3951 小凯的疑惑(最大公因数,未证)
2021.07.20 P3951 小凯的疑惑(最大公因数,未证) 重点: 1.最大公因数 题意: 求ax+by最大的表示不了的数(a,b给定 x,y非负). 分析: 不会.--2021.07.20 代 ...
- Luogu [P3951] 小凯的疑惑
题目详见:[P3951]小凯的疑惑 首先说明:此题为一道提高组的题.但其实代码并没有提高组的水平.主要考的是我们的推断能力,以及看到题后的分析能力. 分析如下: 证明当k>ab-a-b时,小凯可 ...
随机推荐
- 通通WPF随笔(4)——通通手写输入法(基于Tablet pc实现)
原文:通通WPF随笔(4)--通通手写输入法(基于Tablet pc实现) 从我在博客园写第一篇博客到现在已经有1年半了,我的第一篇博客写的就是手写识别,当时,客户需求在应用中加入手写输入功能,由于第 ...
- MVC EF Model First
1 在Models下新建实体数据模型Model.edmx 2 在Model.edmx中点右键建立各个实体,增加Scalar Property 3 空白处点右键,添加关系,勾选增加外键 4 保存Mode ...
- WPF获取控件内部的ScrollViewer,并控制ScrollViewer操作
//获取内部 ScrollViewer方法 public static T FindVisualChild<T>(DependencyObject obj) where T : Depe ...
- 芒果TV For Windows10 成长历史 & 迭代历史 & 新闻报道
芒果TV 是国内领先的基于Windows10操作系统并支持Windows10全系列设备的视频应用和内容服务商. Win10商店版<芒果TV>是湖南快乐阳光互动娱乐传媒有限公司专门为Wind ...
- ASP.NET MVC 下UpdateModel可空未填写的参数为Null,为何不是空字符串
查了好久,终于收到原因: if (bindingContext.ModelMetadata.ConvertEmptyStringToNull && Object.Equals(valu ...
- 请求通道在等待 00:00:58.9616639 以后答复时超时。增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值。分配给此操作的时间可能是更长超时的一部分。
异常信息:请求通道在等待 00:00:58.9616639 以后答复时超时.增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值.分配给此操作的时间可能是更长超时的一部分. 开发背 ...
- error C2760: 语法错误: 意外的令牌“标识符”,预期的令牌为“类型说明符”
解决办法: 打开项目工程----> 属性 ---> c/c++ --> 语音 --> 符合模式 修改成否即可
- MIPS开发板的“不二”选择——Creator Ci20单板计算机评测(芯片是君正JZ4780 ,也就是MIPS R3000,系统推荐Debian或深度,官网就有,其它语言有FreePascal和Go和Java和Python)
在MIPS架构的CPU上开发软件,当然需要使用MIPS专用的工具链来编译代码.不过一般的LINUX发行版内都有相应的配套工具链供用户使用.Ci20出厂时的LINUX发行版为DEBIAN 7.5,相应的 ...
- Capsule Network
Capsule Network最大的特色在于vector in vector out & 动态路由算法. vector in vector out 所谓vector in vector out ...
- Delphi url 编码及转码及特殊字符串替换--百度和腾讯用的就是这个
先介绍一下,Delphi中处理Google的URL编码解码,其中就会明白URL编码转换的方法的 从delphi的角度看Google(谷歌)URL编码解码方式 在网上搜索了一下,似乎没有什么关于goog ...