矩阵乘法和龟速乘这样写!
作者:互联网
明显的矩阵乘法题。
模数很大,要用龟速乘。
写法:
矩阵写在结构体里,不要用重载运算符,结构体内写乘法函数。
下面有龟速乘的模板。
//头文件省略
ll n,mod;
#define madd(a,b) {a=((a+b)%mod+mod)%mod;}
#define mmul(a,b) {a=(a*b%mod+mod)%mod;}
inline ll cheng(ll a,ll b){//龟速乘
ll res=0;
a%=mod;
b%=mod;
while(b){
if(b&1){
madd(res,a);
}
b>>=1;
a=(a<<1)%mod;
}
return res;
}
struct matrix{
ll m[11][11];
matrix mul(matrix x){
matrix res;
ll ans;
For(i,0,10){
For(j,0,10){
ans=0;
For(k,0,10){
madd(ans,cheng(m[i][k],x.m[k][j]));
}
res.m[i][j]=ans;
}
}
return res;
}
}a,b,c;
void pw(ll x){
For(i,0,10) b.m[i][i]=1;
while(x>0){
if(x&1){
b=b.mul(a);
}
x>>=1;
a=a.mul(a);
}
}
signed main(){
IOS;
ll p,q,r,t,u,v,w,x,y,z;
cin>>n>>mod>>p>>q>>r>>t>>u>>v>>w>>x>>y>>z;
ll t1[11][11]={
{p,1,1,0,1,0,0,0,0,0,0},
{q,0,0,0,0,0,0,0,0,0,0},
{1,0,u,1,1,0,0,0,0,0,0},
{0,0,v,0,0,0,0,0,0,0,0},
{1,0,1,0,x,1,0,0,0,0,0},
{0,0,0,0,y,0,0,0,0,0,0},
{r,0,0,0,0,0,1,0,0,0,0},
{t,0,0,0,1,0,2,1,0,0,0},
{0,0,1,0,0,0,0,0,w,0,0},
{0,0,0,0,1,0,0,0,0,z,0},
{1,0,0,0,2,0,1,1,0,0,1}
};
For(i,0,10)
For(j,0,10)
a.m[i][j]=t1[i][j];
pw(n-2);
ll t2[11][11]={
{3,1,3,1,3,1,1,1,w,z,1},
{0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0}
};
For(i,0,10)
For(j,0,10)
c.m[i][j]=t2[i][j];
c=c.mul(b);
cout<<"nodgd "<<c.m[0][0]<<"\nCiocio "<<c.m[0][2]<<"\nNicole "<<c.m[0][4]<<"\n";
return 0;
}
标签:龟速,11,10,ll,矩阵,mul,乘法,mod 来源: https://www.cnblogs.com/zhangshaojia/p/15403871.html