zoukankan      html  css  js  c++  java
  • 【CSP-S 2019】格雷码

    令答案为 (g(n,k)).
    根据题意可知,(g(1,0)=0,g(1,1)=1).
    我们可以通过递归的方式得到答案。
    具体地,当 (k<2^{n-1}) 时,(g(n,k)=0sim g(n-1,k)).
    (kge 2^{n-1}) 时,(g(n,k)=1sim g(n-1,2^{n-1}-1-(k-2^{n-1}))=1sim g(n-1,2^{n-1}-k-1+2^{n-1})).
    为什么不继续化简为 (2^n-k-1) 呢?因为我们注意到,对于最后 5% 的数据,当我们计算 (2^n) 时,会出现 (2^{64})。这已经超过了 unsigned long long 的范围。所以我们通过计算两次 (2^{n-1}),就解决了这个问题。
    (上文中,(sim) 指字符串加法)

    代码:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef unsigned long long ull;
    
    void solve(ull n, ull k) {
    	if (n == 1ull) {
    		cout << k;
    		return;
    	}
    	if (k < (1ull << n - 1)) {
    		cout << 0;
    		solve(n - 1, k); 
    	} else {
    		cout << 1;
    		solve(n - 1, (1ull << n - 1) - k - 1 + (1ull << n - 1));
    	}
    }
    
    int main() {
    	ull n, k;
    	cin >> n >> k;
    	solve(n, k);
    	return 0;
    }
    
  • 相关阅读:
    寒假学习第九天
    寒假学习第八天
    寒假学习第七天
    寒假学习第六天
    寒假学习第五天
    寒假学习第四天
    寒假学习第三天
    寒假学习第二天
    寒假学习第一天
    阅读笔记
  • 原文地址:https://www.cnblogs.com/Xray-luogu/p/13829485.html
Copyright © 2011-2022 走看看