Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int MOD=10000007;
- ifstream fin("pandemia.in");
- ofstream fout("pandemia.out");
- /// Struct ce retine o matrice 3x3
- struct Mat
- {
- long long mat[3][3];
- };
- /// Elementul neutru la înmultirea matricelor 3x3
- Mat nullMat, Cmat, fMat, Put, initMat;
- /// Functie ce calculeaza a*b
- Mat prod(Mat A,Mat B)
- {
- Mat C;
- for(int i=0; i<3; ++i)
- {
- for(int j=0; j<3; ++j)
- {
- C.mat[i][j]=0;
- for(int k=0; k<3; ++k)
- C.mat[i][j]=(C.mat[i][j]%MOD +( 1LL*(A.mat[i][k]%MOD)*(B.mat[k][j]%MOD))%MOD)%MOD;
- }
- }
- return C;
- }
- Mat pwr(Mat mat,int n)
- {
- if(!n)
- return nullMat;
- if(n%2)
- return prod(mat,pwr(prod(mat,mat),n/2));
- return pwr(prod(mat,mat),n/2);
- }
- int main()
- {
- int t;
- fin>>t;
- int n,a,b,u,v,w;
- while(t--)
- {
- fin>>n>>a>>b>>u>>v>>w;
- fMat.mat[0][0]=u;
- fMat.mat[1][0]=v;
- fMat.mat[2][0]=w;
- initMat.mat[0][0]=0; initMat.mat[0][1]=1; initMat.mat[0][2]=0;
- initMat.mat[1][0]=0; initMat.mat[1][1]=0; initMat.mat[1][2]=1;
- initMat.mat[2][0]=1; initMat.mat[2][1]=-b; initMat.mat[2][2]=-a;
- for(int i=0;i<3;++i)
- for(int j=0;j<3;++j)
- if(i!=j)
- nullMat.mat[i][j]=0;
- else
- nullMat.mat[i][j]=1;
- Put=pwr(initMat,n-2);
- Cmat=prod(Put,fMat);
- for(int i=2; i>=0; --i)
- {
- if(Cmat.mat[i][0]<0)
- Cmat.mat[i][0]+=MOD;
- fout<<Cmat.mat[i][0]<<' ';
- }
- fout<<'\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement