bzoj2796 [Poi2012]Fibonacci Representation

来源:互联网 发布:2018pscc是什么软件 编辑:程序博客网 时间:2024/06/05 10:52

题目

感性认识,每次选最接近的斐波那契数就好了。

记忆化一发。

#include<bits/stdc++.h>using namespace std;int T;long long fib[105],n; map <long long,int> f;inline char nc(){    static char buf[100000],*p1=buf,*p2=buf;    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline long long read(){    long long x=0,b=1;    char c=nc();    for(;!(c<='9'&&c>='0');c=nc())if(c=='-')b=-1;    for(;c<='9'&&c>='0';c=nc())x=x*10+c-'0';    return x*b;}inline void write(int x){    if(x==0)putchar('0');    else    {        char buf[15];        int len=0;        if(x<0)putchar('-'),x=-x;        while(x)buf[++len]=x%10+'0',x/=10;        for(int i=len;i>=1;i--)putchar(buf[i]);    }    putchar('\n');}inline int get(long long x){    if(f.count(x))return f[x];    int pos=lower_bound(fib,fib+90,x)-fib;    if(fib[pos]==x)return 1;    return f[x]=min(get(x-fib[pos-1]),get(fib[pos]-x))+1;}int main(){    freopen("in.txt","r",stdin);    fib[0]=fib[1]=1;for(int i=2;i<=90;i++)fib[i]=fib[i-1]+fib[i-2];    T=read();    while(T--)    {        n=read();        write(get(n));    }    return 0;}
原创粉丝点击