Try Again

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\n",ans);
    }
    return 0;
}

 

posted @ 2018-04-27 21:08  十年换你一句好久不见  阅读(509)  评论(0编辑  收藏  举报