第一种
ju jumul(ju a,ju b)
{
int i,j,k;
ju c;
c.CSH();
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(a.a[i][j])
for(k=0;k<n;k++)
c.a[i][k]=(c.a[i][k]+a.a[i][j]*b.a[j][k])%mod;
return c;
}
适用于小矩阵,高次幂
第二种
ju jumul(ju a,ju b)
{
int i,j,k;
ju c;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
c.a[i][j]=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
c.a[i][j]+=a.a[i][k]*b.a[k][j];
c.a[i][j]%=mod;
}
}
return c ;
}
适用于大矩阵,幂比较小的
typedef long long ll;
const ll mod=1e6;
const int maxn=2;
struct ju
{
ll a[maxn][maxn];
void init()
{
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
a[i][j]=0;
for(int i=0;i<maxn;i++)
a[i][i]=1;
}
void CSH()
{
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
a[i][j]=0;
}
};
ju juadd(ju a,ju b)
{
int i,j;
ju c;
for (i=0;i<maxn;i++)
for (j=0;j<maxn;j++)
c.a[i][j]=((a.a[i][j]+b.a[i][j])%mod);
return c;
}
ju jumul(ju a,ju b)
{
int i,j,k;
ju c;
c.CSH();
for(i=0;i<maxn;i++)
for(j=0;j<maxn;j++)
if(a.a[i][j])
for(k=0;k<maxn;k++)
c.a[i][k]=(c.a[i][k]+a.a[i][j]*b.a[j][k])%mod;
return c;
}
template<typename T>
ju fastshe(ju s,T k)
{
ju ans;
ans.init();
for(;k>0;k>>=1)
{
if(k&1)
ans=jumul(ans,s);
s=jumul(s,s) ;
}
return ans;
}
template<typename T>
ju sss(ju s,T k)
{
if (k==1)
return s;
ju tmp;
tmp.init();
tmp=juadd(tmp,fastshe(s,k>>1));
tmp=jumul(tmp,sss(s,k>>1));
if (k&1)
tmp=juadd(tmp,fastshe(s,k));
return tmp;
}