zoukankan      html  css  js  c++  java
  • uva 10479(找规律+递归)

    题意:有一个初始序列第一个数字是0。
    规律是把前一次推出来的每个数字x。先接x个0,然后接x+1。
    0 –> 1 –> 02 –> 1003 –> 02110004
    那么这个序列就变成0,1,0,2,1,0,0,3,0,2,1,1,0,0,0,4…
    问序列里第n个数字是多少,0 < n < 2^63。

    题解:首先能够看出这个序列的第2^k个数字一定是k,然后从第2^k个数字往前看一定是紧接着k-1个0,k-2个1 ,k-3个02。k-4个1003…。一直到k-i为1,把n在k-i这个序列的循环节中位置找到,然后递归下去直到能够确定它的值。

    #include <stdio.h>
    #include <math.h>
    #define ll unsigned long long
    ll n, f[65];
    
    void dfs(int r, ll cur, ll len) {
        if (cur >= len - (r - 1)) {
            printf("0
    ");
            return;
        }
        len = len - (r - 1);
        for (int i = 1, j = r - 2; j > 0; i++, j--) {
            if (cur >= len - j * f[i - 1]) {
                cur = ((cur - (len - j * f[i - 1])) % f[i - 1]) + 1;
                len = f[i - 1];
                if (cur == len)
                    printf("%d
    ", i);
                else
                    dfs(i, cur, len);
                return;
            }
            len = len - j * f[i - 1];
        }
    }
    
    int main() {
        f[0] = 1;
        for (int i = 1; i < 64; i++)
            f[i] = f[i - 1] * 2;
        while (scanf("%lld", &n) == 1 && n) {
            int l;
            for (int i = 0; i < 64; i++) {
                if (n < f[i]) {
                    l = i - 1;
                    break;
                }
            }
            if (f[l] == n)
                printf("%d
    ", l);
            else {
                int r = l + 1;
                dfs(r, n, f[r]);
            }
        }
        return 0;
    }
  • 相关阅读:
    docker将jar打包镜像文件
    特性阻抗(转)
    关于三极管偏置电路的思考
    怎样理解阻抗匹配?(转)
    你要包火到几时呢
    Bluetooth Note
    今年过年没回家
    第二天(tomcat与web程序结构与Http协议与HttpUrlConnection)
    JavaIO操作(1)转换流
    canphp框架功能与特性介绍
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6881941.html
Copyright © 2011-2022 走看看