• Blash


    【问题描述】
    大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为 基的集合Ba定义如下:

    (1)a是集合Ba的基,且a是Ba的第一个元素;

    (2)如果x在集合Ba中,则2x+1和3x+1也都在集合Ba中;

    (3)没有其他元素在集合Ba中了。

    现在小高斯想知道如果将集合Ba中元素按照升序排列,第N个元素会是多少

    【输入格式】
    输入包括很多行,每行输入包括两个数字,集合的基a(1<=a<=50))以及 所求元素序号n

    【输出格式】
    对于每个输入,输出集合Ba的第n个元素值

    【样例输入】
    1 100

    28 5437

    【样例输出】
    418 900585

    【数据规模与约定】
    对于20%的数据,n<=1000
    对于100%的数据,n<=100000,a<=50

    数据组数小于5


     虽然在讲队列时学过,但考试就全忘光。

    思路:

    其实很简单,用一个 a[ ] 存储 2*x+1 , b[ ] 存储 3*x+1 , 不断从两个数组里取小的更新后面的 ,再计个数,到 n 了就打断输出即可

    代码:

    #include<stdio.h>
    const int MX=1000010;
    int a[MX],b[MX]; 
    
    int main()
    {
        freopen("blash.in","r",stdin),freopen("blash.out","w",stdout);
        int x,n;
        while(scanf("%d%d",&x,&n)!=EOF)
        {
            int tot=1,la=0,lb=0,ra=1,rb=1;
            while(1)
            {
                if(tot==n) {
                    printf("%d
    ",x);
                    break;
                }
                a[++la]=2*x+1;
                b[++lb]=3*x+1;
                if(a[ra]<b[rb]) {
                    x=a[ra++];
                }
                else if(b[rb]<a[ra]) {
                    x=b[rb++];
                }
                else {
                    x=a[ra++];
                    rb++;
                }
                tot++;
            }
        }
        return 0;
    }
    从0到1很难,但从1到100很容易
  • 相关阅读:
    ubuntu18安装paddle的cpu版本错误
    博客园的推荐150名大牛的地址
    课堂翻译
    小组介绍
    Sunshine小组
    项目进程
    总结
    布置的开发项目
    一周总结
    每周学习
  • 原文地址:https://www.cnblogs.com/qseer/p/9539081.html
Copyright © 2020-2023  润新知