历届试题 买不到的数目(欧几里得 蓝桥杯)

  历届试题 买不到的数目  

时间限制: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\ty=%I64d\n",x,y);

    if(d==1&&mmin>1);

    {

        int cnt=0;

        while(1)

        {

            if(cnt>=mmin){printf("%I64d\n",i-mmin-1);break;}

            LL xx=i*x;

            LL yy=i*y;

 //           printf("xx=%I64d\tyy=%I64d\n",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;

}

 

 

 

 

 

 

你可能感兴趣的:(蓝桥杯)