zoukankan      html  css  js  c++  java
  • 二进制下的斐波那契

    链接:https://www.nowcoder.com/acm/contest/91/F
    来源:牛客网

    小Y在研究数字的时候,发现了一个神奇的等式方程,他屈指算了一下有很多正整数x满足这个等式,比如1和2,现在问题来了,他想知道从小到大第N个满足这个等式的正整数,请你用程序帮他计算一下。

    (表示按位异或运算)

    输入描述:

    第一行是一个正整数,表示查询次数。

    接着有T行,每行有一个正整数,表示小Y的查询。

    输出描述:

    对于每一个查询N,输出第N个满足题中等式的正整数,并换行。
    示例1

    输入

    4
    1
    2
    3
    10

    输出

    1
    2
    4
    18

    题意 : 询问你第 n 个数的满足上述条件的数是什么?
    思路 :
      首先我们可以本地暴力打表,看一下在数据小的情况下的规律是什么,会发现答案在二进制下的位数是满足斐波那契规律的,粗略估计一下其最大的答案也不会超 long long,
    对于一个询问的 n ,我们可以将其拆分成几个和是 n 的斐波那契数,然后求和得加 1 << (pos-1)即可

    代码示例 :
    ll a[70];   
    void init(){
        a[0] = 1, a[1] = 1;
        
        for(int i = 2; i <= 60; i++){
            a[i] = a[i-1]+a[i-2];
        }
    }
    int main() {
        //freopen("in.txt", "r", stdin);
        //freopen("out.txt", "w", stdout);
        ll t, n;
        init(); 
        //for(int i = 1; i <= 60; i++) printf("%lld 
    ", a[i]);
        cin >>t;
        while(t--){
            scanf("%lld", &n);
            
            ll ans = 0;
            while(n > 0){
                int pos = upper_bound(a+1, a+61, n)-a-1;
                //printf("*** %d
    ", pos);
                ans += (1ll<<(pos-1));
                n -= a[pos];
            }
            printf("%lld
    ", ans);
        }
        return 0;
    }
    


    东北日出西边雨 道是无情却有情
  • 相关阅读:
    刨析Maven(对pom.xml配置文件常用标签的解析)
    sublime text 3 使用技巧
    CSS3之渐变
    CSS3之过渡
    定位
    Java中的正则表达式
    CSS3之转换
    CSS布局
    导航条菜单制作总结
    Transition
  • 原文地址:https://www.cnblogs.com/ccut-ry/p/8849422.html
Copyright © 2011-2022 走看看