Cod sursa(job #767296)

Utilizator test_666013Testez test_666013 Data 13 iulie 2012 10:58:09
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define mod 666013

typedef long long ll;

ll a[2][2] = {{1,1},{1,0}};
ll r[2][2] = {{1,1},{1,0}};


void tipar(ll a[2][2]){
    ll v[2] = {1,1}, w[2] = {0,0};

    for(int i=0;i<2;i++)
    for(int k=0;k<2;k++) w[i] = (w[i] + (v[k] * r[k][i])%mod)%mod;
/*
    for(int i=0;i<2;i++) printf("%lld ",w[i]); printf("\n");

    for(int i=0;i<2;i++){
    for(int j=0;j<2;j++)printf("%lld ",a[i][j]); printf("\n"); }
*/
    printf("%lld\n",w[0]);
}

void produs(ll r[2][2],ll a[2][2]){
    ll x[2][2];

    for(int i=0;i<2;i++)
    for(int j=0;j<2;j++) x[i][j] = 0;

    for(int i=0;i<2;i++)
    for(int j=0;j<2;j++)
    for(int k=0;k<2;k++) x[i][j] = (x[i][j] + (r[i][k] * a[k][j])%mod)%mod;

    for(int i=0;i<2;i++)
    for(int j=0;j<2;j++) r[i][j] = x[i][j];
}

void pow(int k){
    if(k > 1)
    {
        pow(k/2);
        if(k%2)
        {
            produs(r,r);
            produs(r,a);
        } else produs(r,r);
    }
}

int main(){
    int k;
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);

    scanf("%d",&k);

    pow(k-2);

    tipar(r);

    return 0;
}