题意:
根据上面的式子求最后结果。
思路:有递推式,想到构造矩阵。
ai和bi的关系很容易列出来,最后结果是一个求和的式子,注意到求和是从0到n-1的,也就是n=1时才是a0*b0,n=0时直接没有值,这一点是一个坑的地方。
然后做法是设Fi=ai*bi,这样可以列出几个关系式:
这样次数应该是n-1,注意n=0特判。
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef long long LL;
const int N = 5;
const int MOD = 1000000007;
struct Matrix
{
LL m[N][N];
};
Matrix I = {//I主对角线是1
1,0,0,0,0,
0,1,0,0,0,
0,0,1,0,0,
0,0,0,1,0,
0,0,0,0,1
};
Matrix multi(Matrix a,Matrix b)//矩阵乘法
{
Matrix c;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
c.m[i][j] = 0;
for(int k=0;k<N;k++)
c.m[i][j] += a.m[i][k] * b.m[k][j] % MOD;
c.m[i][j] %= MOD;
}
}
return c;
}
Matrix power(Matrix A,LL k)//矩阵A的k次幂(快速幂)
{
Matrix ans = I,p = A;
while(k)
{
if(k&1)
{
ans = multi(ans,p);
k--;
}
k >>= 1;
p = multi(p,p);
}
return ans;
}
int main()
{
LL n,ax,ay,a0,bx,by,b0;
while(scanf("%lld%lld%lld%lld%lld%lld%lld",&n,&a0,&ax,&ay,&b0,&bx,&by)!=-1)
{
Matrix A={
1,(ax*bx)%MOD,(ax*by)%MOD,(ay*bx)%MOD,(ay*by)%MOD,
0,(ax*bx)%MOD,(ax*by)%MOD,(ay*bx)%MOD,(ay*by)%MOD,
0,0,ax,0,ay,
0,0,0,bx,by,
0,0,0,0,1
};
LL anss=0;
if(n==0)anss=0;
else{
Matrix ans=power(A,n-1);
anss=((((((ans.m[0][0]*a0)%MOD*b0)%MOD+((ans.m[0][1]*a0)%MOD*b0)%MOD)%MOD+(ans.m[0][2]*a0)%MOD)%MOD+(ans.m[0][3]*b0)%MOD)%MOD+ans.m[0][4])%MOD;
}printf("%lld\n",anss);
}
return 0;
}