zoukankan      html  css  js  c++  java
  • 2018年湘潭大学程序设计竞赛 Fibonacci进制

    Fibonacci数是非常有名的一个数列,它的公式为 f(n)=f(n-1)+f(n-2),f(0)=1,f(1)=2。 
    我们可以把任意一个数x表示成若干不相同的Fibonacci数的和, 比如说14 = 13+1 = 8+5+1 = 8+3+2+1。
    如果把Fibonacci数列作为数的位权,即f(i)作为第i位的位权,每位的系数只能是0或者1,从而得到一个01串。 比如14可以表示成 100001,11001,10111。 我们再把这个01串看成2进制,再转成10进制以后就变成了 33,25,23。 为了避免歧义,我们将使用最小的那个值23。
     请按照这个过程计算一下10进制整数通过上述转换过程得到的10进制整数。

    输入描述:

    第一行是一个整数T(1 ≤ T ≤ 10000),表示样例的个数。
    以后每行一个样例,为一个十进制正整数x(1 ≤ x ≤ 10

    9

    )。

    输出描述:

    每行输出一个样例的结果。
    示例1

    输入

    5
    1
    10
    100
    1000
    1000000000

    输出

    1
    14
    367
    10966
    4083305275263
    因为2^0+2^1+2^2<2^3;
    所以只要保证最高位尽可能的小
    还有所有的数都保证可以转化为斐波那契数之和,因此从小开始累加
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <cstdlib>
    #include <iomanip>
    #include <cmath>
    #include <cassert>
    #include <ctime>
    #include <map>
    #include <set>
    using namespace std;
    #pragma comment(linker, "/stck:1024000000,1024000000")
    #define lowbit(x) (x&(-x))
    #define max(x,y) (x>=y?x:y)
    #define min(x,y) (x<=y?x:y)
    #define MAX 100000000000000000
    #define MOD 1000000007
    #define pi acos(-1.0)
    #define ei exp(1)
    #define PI 3.1415926535897932384626433832
    #define ios() ios::sync_with_stdio(true)
    #define INF 0x3f3f3f3f
    #define mem(a) ((a,0,sizeof(a)))
    typedef long long ll;
    ll f[45],dp[45];
    ll t,n,vis[50],ans;
    void init()
    {
        f[0]=1,f[1]=2;
        dp[0]=1;dp[1]=2;
        for(int i=2;i<=45;i++)
        {
            f[i]=f[i-1]+f[i-2];
            dp[i]=dp[i-1]*2;
        }
    }
    int main()
    {
        init();
        scanf("%lld",&t);
        while(t--)
        {
            scanf("%lld",&n);
            ans=0;
            memset(vis,0,sizeof(vis));
            int pos;
            for(pos=0;pos<=45;pos++)
            {
                ans+=f[pos];
                vis[pos]=1;
                if(ans>=n) break;
            }
            for(int i=pos;i>=0;i--)
            {
                if(ans-f[i]>=n)
                {
                    ans-=f[i];
                    vis[i]=0;
                }
            }
            ans=0;
            for(int i=pos;i>=0;i--)
                ans+=vis[i]*dp[i];
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    hbase安装(zookeeper等)
    虚函数表以及RTTI阅读(阅后焚)
    void及void指针含义的深刻解析
    泛型和模版的区别
    C++析构函数为什么要为虚函数
    C++对象模型
    在C++中子类继承和调用父类的构造函数方法
    什么是复合类型
    C++ read
    gdb 调试c/c++的一些小技巧
  • 原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/8964468.html
Copyright © 2011-2022 走看看