Thursday, March 8, 2012

My solution of 763 - Fibinary Numbers (C++ without BigInteger)


763 - Fibinary Numbers

(WA) many times... but still don't know why. maybe missing the last linebreak.
(CE) Cannot use printf in UVAonlinejudge without #include<stdio.h>



#include <iostream>
#include <sstream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <list>


#define sz(k) (int)(k).size()
#define tr(c,i) for(typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define forr(i,r) for(int i=0;i<r;i++)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define drep(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back
#define nl(c) c<<endl;
#define db(cout,c) tr(c,it){cout<<" "<<*it;};nl(cout); 
#define inf24 (int)(1<<23-1)
#define inf32 (int)(1<<31-1)
#define inf64 (long long)(1LL<<63-1)
using namespace std;


#define NN 10240
unsigned long long fb[NN+NN+2];
int sum[(NN+NN+2)];
unsigned long long cksum1,cksum2;


int main(int argc, char *argv[])
{


//fb[0]=1;fb[1]=2;
//forr(i,NN+NN)fb[i+2]=fb[i]+fb[i+1];
    
    int T=0,stage=1;
    string S1,S2;
    while(cin>>S1>>S2)
    {
        if(T>0)cout<<endl;
        T++;
//cout<<"S1="<<S1<<endl;
//cout<<"S2="<<S2<<endl;


        forr(i,NN+NN)sum[i]=0;
        forr(i,S1.size())sum[S1.size()-i-1]=(S1[i]-'0');
        forr(i,S2.size())sum[S2.size()-i-1]+=(S2[i]-'0');
/*
cksum1=0;
forr(i,NN+NN)cksum1+=sum[i]*fb[i];
stage=1;
drep(i,NN+NN-1,0){
    if(stage==1)if(sum[i]>=1)stage=2;
    
    if(stage==2)
        cout<<sum[i];
        
}
cout<<" ("<<cksum1<<")";
cout<<endl;
*/       
        stage=1;
        while(stage==1)
        {
            stage=2;
            forr(i,NN+NN-2)
            {
                if(sum[i]>=1&&sum[i+1]>=1)
                {
                    sum[i]--;
                    sum[i+1]--;
                    sum[i+2]++;
                    stage=1;
                }
                else if(sum[i]>=2&&i>1)
                {
                    sum[i]--;
                    sum[i]--;
                    sum[i+1]++;
                    sum[i-2]++;
                    stage=1;
                }
                else if(sum[1]>=2)
                {
                    sum[1]-=2;
                    sum[2]++;
                    sum[0]++;
                    stage=1;
                }
                else if(sum[0]>=2)
                {
                    sum[0]-=2;
                    sum[1]++;
                    stage=1;
                }
            }
        }
  
        stage=1;
        drep(i,NN+NN-1,0){
            if(stage==1)
                if(sum[i]>=1)stage=2;
            if(stage==2)
                cout<<sum[i];
        }
        if(stage==1)cout<<"0";
        stage=2;
        
//cksum2=0;
//forr(i,NN+NN)cksum2+=sum[i]*fb[i];
//cout<<" ("<<cksum2<<")";


        cout<<endl;
//        printf("\r\n");
        
    };
    return 0;
}



No comments:

Post a Comment