Cod sursa(job #1122725)

Utilizator sddddgjdZloteanu Anastasia sddddgjd Data 25 februarie 2014 20:07:42
Problema Iepuri Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<stdio.h>
#include<string.h>
#define MOD 666013
int m[3][3];
void inmultire(int a[3][3], int b[3][3], int c[3][3])
{
    int aux[3][3];
    int i,j;
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            aux[i][j]=0;
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
        {
            int cont;
            for(cont=0;cont<3;cont++)
                aux[i][j]+=(1LL*a[i][cont]*b[cont][j])%MOD;
        }
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            c[i][j]=aux[i][j];
}
void expon(int A[3][3],int putere)
{
    int ans[3][3],i,j;
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            ans[i][j]=0;
    ans[0][0]=ans[1][1]=ans[2][2]=1;
    while(putere!=0)
    {
        if(putere%2==1)
            inmultire(ans,A,ans);
        inmultire(A,A,A);
        putere/=2;
    }
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            A[i][j]=ans[i][j];
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("iepuri.in","r");
    fout=fopen("iepuri.out","w");
    int t;
    fscanf(fin,"%d",&t);
    while(t)
    {
        int a,b,c,x,y,z,n;
        fscanf(fin,"%d%d%d%d%d%d%d",&x,&y,&z,&a,&b,&c,&n);
        m[0][0]=m[0][1]=m[2][0]=m[1][1]=0;
        m[1][0]=m[2][1]=1;
        m[0][2]=c;
        m[1][2]=b;
        m[2][2]=a;
        expon(m,n-2);
        fprintf(fout,"%lld\n",(1LL*m[0][2]*x+1LL*m[1][2]*y+1LL*z*m[2][2])%MOD);
        t--;
    }
    return 0;
}