Cod sursa(job #1059150)

Utilizator kommancs96Nagy Daniel kommancs96 Data 16 decembrie 2013 11:44:06
Problema Cifra Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <cstdio>
#include <cstdlib>
#define NUM_CNT 1200
#define FEHER 0
#define KEK 1
#define PIROS 2
#define ZOLD 3
#define SARGA 4
using namespace std;
int N;
inline void beolvas(int &n){
    FILE* in = fopen("culori3.in","r");
    fscanf(in,"%d",&n);
}
///Here begins the hard part
class BigNum{
public:
    int nums[NUM_CNT];
    BigNum operator+(BigNum a);
    BigNum& operator=(const BigNum& a);
    static BigNum getOne();
    void printToFile(FILE* f);
};

BigNum BigNum::operator+(BigNum a){
    BigNum tmp;
    int carry = 0;
    for(int k = NUM_CNT-1;k >= 0;k--){
        tmp.nums[k] = ( this->nums[k] + a.nums[k] + carry )%10;
        carry = (this->nums[k] + a.nums[k] + carry)/10;
    }
    return tmp;
}
BigNum& BigNum::operator=(const BigNum &a){
    for(int k = NUM_CNT-1;k >= 0;k--){
        this->nums[k] = a.nums[k];
    }
    return *this;
}
BigNum BigNum::getOne(){
    BigNum a;
    for(int k = NUM_CNT-1;k >= 0;k--){
        a.nums[k] = 0;
    }
    a.nums[NUM_CNT - 1] = 1;
    return a;
}
void BigNum::printToFile(FILE* f){
    int jozsi = 0;
    for(int k = 0;k < NUM_CNT;k++){
        if(this->nums[k] != 0 || jozsi == 1){
            fprintf(f,"%d",this->nums[k]);
            jozsi = 1;
        }
    }
}
void solver_hard(){
    BigNum szinek[2][5];

    szinek[0][FEHER] = BigNum::getOne();
    szinek[0][KEK] = BigNum::getOne();
    szinek[0][PIROS] = BigNum::getOne();
    szinek[0][ZOLD] = BigNum::getOne();
    szinek[0][SARGA] = BigNum::getOne();

    int i = 1;
    while(i <= N){
        if(i%2==1){
            szinek[1][FEHER] = szinek[0][KEK];
            szinek[1][KEK] = szinek[0][FEHER] + szinek[0][PIROS];
            szinek[1][PIROS] = szinek[0][KEK] + szinek[0][ZOLD];
            szinek[1][ZOLD] = szinek[0][PIROS] + szinek[0][SARGA];
            szinek[1][SARGA] = szinek[0][ZOLD];
        }else{
            szinek[0][FEHER] = szinek[1][KEK];
            szinek[0][KEK] = szinek[1][FEHER] + szinek[1][PIROS];
            szinek[0][PIROS] = szinek[1][KEK] + szinek[1][ZOLD];
            szinek[0][ZOLD] = szinek[1][PIROS] + szinek[1][SARGA];
            szinek[0][SARGA] = szinek[1][ZOLD];
        }
        i++;
    };

 BigNum out;
    if(N%2==0){
        out = szinek[1][FEHER] + szinek[1][KEK] + szinek[1][PIROS] + szinek[1][ZOLD] + szinek[1][SARGA];
    }else out = szinek[0][FEHER] + szinek[0][KEK] + szinek[0][PIROS] + szinek[0][ZOLD] + szinek[0][SARGA];

    FILE* f = fopen("culori3.out","w");
    out.printToFile(f);
}
int main()
{
    beolvas(N);
     solver_hard();
    return 0;
}