zoukankan      html  css  js  c++  java
  • 【解题报告】CSP2019-S D1T1 格雷码

    题目链接:https://www.luogu.org/problem/P5657

    话说这道题怎么是道橙题啊。

    基本思路

    1. 因为n位格雷码的前2n-1位就是n-1位格雷码前面加了一位‘0’,所以可以把它们近似的看作和n-1位格雷码相同
    2. 寻找第k位格雷码是通过哪一个格雷码得出的,以4位格雷码为例,因为第10号格雷码是由5号的前面加了“1”得到的,所以10号与5号对应  
    3. 如果k小于2n-1,即最高位为0,它与本身对应
    4. 按上述方法求出在n-1位格雷码中刚才算出的对应编号的值,然后在前面加上“0”或“1”
    5. 因为数据范围位264,所以要用 unsigned long long 。

    代码:

    #include <bits/stdc++.h>
    #define ull unsigned long long
    using namespace std;
    
    int n, n1, n2, shuzu[10086];
    ull k;
    
    ull mypow(int a, int b){
        ull ans=1;
        for(int i=0; i<b; i++) ans*=a;
        return ans;
    }
    
    void digui(ull x){
        if(x==0){
            shuzu[0]=0;
            return;
        }
        else if(x==1){
            shuzu[0]=1;
            return;
        }
        else{
            if(x>=n1/2){
                n--;
                n1/=2;
                shuzu[n]=1;
                digui(mypow(2, n+1)-x-1);
            }
            else{
                n--;
                n1/=2;
                shuzu[n]=0;
                digui(x);
            }
        }
    }
    
    int main(){
        scanf("%d %llu", &n, &k);
        n2=n;
        n1=mypow(2, n);
        digui(k);
        for(int i=n2-1; i>=0; i--){
            printf("%d", shuzu[i]);
        }
    
        return 0;
    }

    果然还是爆栈了。。

  • 相关阅读:
    流体力学笔记 第二章 流体力学的基本概念
    jvm常用的参数
    链表的反转
    数据流中的中位数
    二叉树对称
    二叉树镜像
    输入框校验
    判断单选或者复选框中选中的值
    网页中window.open 弹出 父页面和子页面数值交互
    数组去重
  • 原文地址:https://www.cnblogs.com/dong628/p/11872902.html
Copyright © 2011-2022 走看看