Pagini recente » Istoria paginii runda/zarzavat | Diferente pentru blog/viata-dupa-olimpiade-1 intre reviziile 30 si 19 | Cod sursa (job #1086746) | Monitorul de evaluare | Cod sursa (job #2332344)
#include <bits/stdc++.h>
using namespace std;
#define Matrix vector< vector<int> >
Matrix operator * (Matrix a,Matrix b)
{
Matrix ans;
int r1=a.size(),c1=a[0].size();
int r2=b.size(),c2=b[0].size();
if(c1!=r2)
return ans;
for(int i=0;i<r1;i++)
{
ans.push_back({});
for(int j=0;j<c2;j++)
{
ans[i].push_back(0);
for(int k=0;k<c1;k++)
{
long long F=a[i][k];
long long S=b[k][j];
long long sum=(F*S+ans[i][j])%666013;
ans[i][j]=sum;
}
}
}
return ans;
}
Matrix Power(Matrix a,int b)
{
Matrix ans;
int r=a.size(),c=a[0].size();
if(r!=c)
return ans;
for(int i=0;i<r;i++)
{
ans.push_back({});
for(int j=0;j<c;j++)
ans[i].push_back((i==j));
}
while(b)
{
if(b%2)
{
ans=ans*a;
}
a=a*a;
b/=2;
}
return ans;
}
void slove()
{
int x,y,z,a,b,c,n;
cin>>x>>y>>z>>a>>b>>c>>n;
Matrix f;
f.resize(1);
f[0].resize(3);
Matrix s;
s.resize(3);
for(int i=0;i<3;i++)
{
s[i].resize(3,0);
}
f[0][0]=x;
f[0][1]=y;
f[0][2]=z;
s[0][2]=c;
s[1][0]=1;
s[1][2]=b;
s[2][1]=1;
s[2][2]=a;
n-=2;
Matrix res=f;
res=res*Power(s,n);
cout<<res[0][2]<<"\n";
}
int main()
{
freopen("iepuri.in","r",stdin);
freopen("iepuri.out","w",stdout);
int t;
cin>>t;
while(t--)
{
slove();
}
return 0;
}