链接:https://ac.nowcoder.com/acm/contest/885/B
题意:xi=a⋅xi−1+b⋅xi−2 for all i≥2 求第n项取mod的值 1<n<10^(10^6) 10^9<mod<2*10^9
思路:n超级大,用以10为单位的快速幂求解
转置矩阵
a b
0 0
基础矩阵
x1 0
x0 0
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <map>
#include <bits/stdc++.h>
#include <set>
#include <bitset>
#include <stack>
using namespace std;
typedef long long ll;
const long long N=2;
ll mod;
char ss[1000010];
struct matrix
{
long long a[N][N];
matrix()
{
memset(a,0,sizeof(a));
}
void init()
{
memset(a,0,sizeof(a));
for(long long i=0;i<N;i++)
{
a[i][i]=1;
}
}
};
matrix multip(matrix x,matrix y)
{//相乘
matrix temp;
for(long long i=0;i<N;i++)
{
for(long long j=0;j<N;j++)
{
for(long long k=0;k<N;k++)
{
temp.a[i][j]=(temp.a[i][j]%mod+x.a[i][k]*y.a[k][j]%mod)%mod;
}
}
}
return temp;
}
matrix qpow(matrix M,long long k)
{//矩阵快速幂
matrix temp;
temp.init();
while(k)
{
if(k&1)
{
temp=multip(temp,M);
}
k>>=1;
M=multip(M,M);
}
return temp;
}
int main()
{
int x0,x1,a,b;
scanf("%d%d%d%d",&x0,&x1,&a,&b);
scanf("%s",ss);
scanf("%lld",&mod);
int len=strlen(ss);
matrix A,B;
B.a[0][0]=a;//转置矩阵
B.a[0][1]=b;
B.a[1][0]=1;
B.a[1][1]=0;
A.a[0][0]=x1;//基础矩阵
A.a[0][1]=0;
A.a[1][0]=x0;
A.a[1][1]=0;
for(int i=len-1;i>=0;i--)
{
if(ss[i]-'0'>0)
{
matrix tp=qpow(B,ss[i]-'0');
A=multip(tp,A);
}
B=qpow(B,10);
}
printf("%lld\n",A.a[1][0]);
return 0;
}