Hexadecimal's theorem

来源:互联网 发布:手机进货软件 编辑:程序博客网 时间:2024/04/29 21:48

A - A
Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u
Submit Status Practice CodeForces 199A

Description

Recently, a chaotic virus Hexadecimal advanced a new theorem which will shake the Universe. She thinks that each Fibonacci number can be represented as sum of three not necessary different Fibonacci numbers.

Let's remember how Fibonacci numbers can be calculated. F0 = 0F1 = 1, and all the next numbers are Fi = Fi - 2 + Fi - 1.

So, Fibonacci numbers make a sequence of numbers: 011235813, ...

If you haven't run away from the PC in fear, you have to help the virus. Your task is to divide given Fibonacci number n by three not necessary different Fibonacci numbers or say that it is impossible.

Input

The input contains of a single integer n (0 ≤ n < 109) — the number that should be represented by the rules described above. It is guaranteed that n is a Fibonacci number.

Output

Output three required numbers: ab and c. If there is no answer for the test you have to print "I'm too stupid to solve this problem" without the quotes.

If there are multiple answers, print any of them.

Sample Input

Input
3
Output
1 1 1
Input
13
Output
2 3 8

#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define  N 1000000000unsigned long long num[110000];int main(){    memset(num,0,sizeof(num));    unsigned long long n;    int count;    num[1]=num[2]=1;    for(count=3;; count++)        if(num[count]<N)  num[count]=num[count-1]+num[count-2];        else break;    while(scanf("%I64d",&n)!=EOF)    {        int last,first=0;        last=count;        while(last>first)        {            if(num[(first+last)/2]>n) last=(first+last)/2-1;            else if(num[(first+last)/2]<n) first=(first+last)/2+1;            else break;        }        first=(first+last)/2;        if(num[first]==n) printf("0 0 %I64d\n",n);        else        {            int flag=0,j;            if(first>=4) j=first-4;            else j=0;            first+=4;            for(; j<first; j++)                if(flag) break;                else  for(int x=j; x<first; x++)                        if(flag) break;                        else  for(int y=x; y<first; y++)                                if(num[j]+num[x]+num[y]==n)                                {                                    printf("%I64u %I64u %I64u\n",num[j],num[x],num[y]);                                    flag=1;                                    break;                                }            if(!flag) printf("I'm too stupid to solve this problem\n");        }    }    return 0;}


原创粉丝点击