Cod sursa(job #2546954)

Utilizator Stefan_PiscuPiscu Stefan Constantin Stefan_Piscu Data 14 februarie 2020 19:03:12
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <bits/stdc++.h>
using namespace std;

#define MOD 666013

ifstream fin("iepuri.in");
ofstream fout("iepuri.out");

struct mat{
  long long n, m;
  vector<vector<long long>> a;
  mat(long long na, long long ma){
    a.resize(na+1);
    n=na;
    m=ma;
    for(long long i=1;i<=na;++i){
      a[i].resize(ma+1, 0);
    }
  }
  mat operator*(mat b){
    mat sol(n, b.m);
    for(long long i=1;i<=n;++i){
      for(long long j=1;j<=min(m, b.n);++j)
        for(long long k=1;k<=b.m;++k){
          sol.a[i][k]=sol.a[i][k]+a[i][j]*b.a[j][k]%MOD;
          sol.a[i][k]%=MOD;
        }
    }
    return sol;
  }
};

mat binpow(mat b, long long e){
  mat ans(0, 0);
  bool ok=1;
  while(e){
    if(e&1){
      if(ok) ok=0, ans=b;
      else ans=b*ans;
    }
    b=b*b;
    e>>=1;
  }
  return ans;
}

int main()
{
  long long t;
  fin>>t;
  while(t--){
    long long a, b, c, x, y, z, cnt;
    fin>>x>>y>>z>>a>>b>>c>>cnt;
    mat m(3, 3);
    m.a[1][1]=a;
    m.a[1][2]=b;
    m.a[1][3]=c;
    m.a[2][1]=1;
    m.a[3][2]=1;
    mat start(3, 1);
    start.a[1][1]=z;
    start.a[2][1]=y;
    start.a[3][1]=x;
    m=binpow(m, cnt-2);
    start=m*start;
    fout<<start.a[1][1]<<"\n";
  }
  return 0;
}