Cod sursa(job #835322)

Utilizator stoicatheoFlirk Navok stoicatheo Data 16 decembrie 2012 00:48:53
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<fstream>
#include<string.h>
#define mod 666013
#define dim 3
 
 
using namespace std;
 
ifstream f("iepuri.in");
ofstream g("iepuri.out");
 
long long unitate[dim][dim];
long long sum , T,X[dim],a,b,c,n;
long long A[dim][dim],temp[dim][dim],sol[dim][dim];
int i;
 
void multiply(long long Pn[dim][dim],long long P[dim][dim],long long rez[dim][dim]){
    int i,j,k;
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            rez[i][j]=0;
            for(k=0;k<3;k++){
                rez[i][j]+=Pn[i][k]*P[k][j]%mod;
                if(rez[i][j]>=mod)
                    rez[i][j]-=mod;
            }
        }
    }
}
 
 
int main(){
     
    f>>   T;
    unitate[0][0]=unitate[1][1]=unitate[2][2]=1;
    while(T--){
        f>>X[2]>>X[1]>>X[0]>>a>>b>>c>>n;
         
        A[1][1]=A[1][2]=A[2][0]=A[2][2]=0;
        A[1][0]=A[2][1]=1;
        A[0][0]=a;A[0][1]=b;A[0][2]=c;
         
        n-=2;
         
        memcpy(sol,unitate,sizeof(sol));
         
        while(n!=0){
            if(n%2){
                multiply(sol,A,temp);
                memcpy(sol,temp,sizeof(sol));
            }
            multiply(A,A,temp);
            memcpy(A,temp,sizeof(A));
            n/=2;
        }
        sum=0;
        for(i=0;i<3;i++){
            sum+=(sol[0][i]*X[i])%mod;
            sum%=mod;
        }
        g<<sum<<'\n';
    }
     
     
    return 0;
}