历届试题 买不到的数目
时间限制:1.0s 内存限制:256.0MB
问题描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数,表示每种包装中糖的颗数(都不多于1000)
输出格式
一个正整数,表示最大不能买到的糖数
样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7
interesting:算是一题欧几里得的变形吧,也是求不定方程;用题目的已知数据就是:4x+7y =!Cmax;
我们可以这样想,4x+7y=c; 令4x+7y=1;求特解x0和y0 那么扩大cmin =min(4,7);
然后特解扩大c倍,利用(x=x0+7k,y=y0-4k)或(x=x0-7k,y=y0+4k)在x0和y0 小于0的时候将一边扩大,然后判断另一边是否大于0;如果大于0,则说明符合条件,那我就记录连续满足条件的数量cnt,如果cnt比cmin 比大,那么,之后的数必定可以被组成,这就是以个题目的技巧;
我用X表示不能组成,用O表示能组成;eg:(4,7)
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | .... |
X | X | X | O | X | X | O | O | X | X | O | O | X | O | O | O | X | O | O | O | O | O | O | .... |
转载请注明出处:寻找&星空の孩子
题目链接: http://lx.lanqiao.org/problem.page?gpid=T31
#include<stdio.h> #define LL long long #define NN 10000005 bool num[NN]; void exgcd(LL a,LL b,LL &d,LL &x,LL &y) { if(b==0) { d=a; x=1; y=0; return ; } else { exgcd(b,a%b,d,y,x); y-=x*(a/b); } } LL gcd(LL a,LL b) { if(!b)return a; else gcd(b,a%b); } int main() { LL m,n,d,x,y; scanf("%I64d%I64d",&m,&n); exgcd(m,n,d,x,y); LL mmin=m<n?m:n; LL i=mmin; // printf("x=%I64d y=%I64d ",x,y); if(d==1&&mmin>1); { int cnt=0; while(1) { if(cnt>=mmin){printf("%I64d ",i-mmin-1);break;} LL xx=i*x; LL yy=i*y; // printf("xx=%I64d yy=%I64d ",xx,yy); if(xx<0) { while(xx<0) { xx+=n; yy-=m; } if(yy>=0) cnt++; else cnt=0; } else if(yy<0) { while(yy<0) { xx-=n; yy+=m; } if(xx>=0) cnt++; else cnt=0; } i++; } } return 0; }