Cod sursa(job #2332344)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 30 ianuarie 2019 17:36:30
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#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;
}