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


      历届试题 买不到的数目  

    时间限制: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;
    }

     

     
  • 相关阅读:
    matlab中用来批量读取的dir函数
    cat 函数应用
    线性移不变系统
    为什么低频信息描述了图像在光滑部位的整体灰度信息,而高频部分则反映了图像在边缘、噪声等细节方面的表现?
    红灯检测宇视科技专利分析与总结2
    红灯检测宇视科技专利分析与总结1
    matlab中冒号的用法
    第一篇博文,大橙子的博客生涯要开始啦
    Spring Boot和Shiro整合
    Spring Boot + Redis使用短信平台发送验证码(腾讯云短信平台)
  • 原文地址:https://www.cnblogs.com/yuyixingkong/p/4392300.html
Copyright © 2020-2023  润新知