您的位置:首页 > 其它

codeforces 678D Iterated Linear Function 矩阵快速幂

2016-06-22 21:36 465 查看
矩阵快速幂的题要多做

由题可得 g
=A*g[n-1]+B

所以构造矩阵 { g
} = {A B} * { g[n-1]}

{ 1 } {0 1} { 1 }

然后矩阵快速幂就好 矩阵快速幂的题要多做,多构造矩阵

注:其实这个题可以直接等比数列求求和,单数矩阵快速幂对于这类题更具有普遍性

#include <cstdio>
#include <iostream>
#include <ctime>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N=5e2+5;
const int INF=0x3f3f3f3f;
const LL mod=1e9+7;
LL res[2][2],cur[2][2],a,b,n,x,tmp[2][2];
void mul(LL x[2][2],LL y[2][2])
{
memset(tmp,0,sizeof(tmp));
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
for(int k=0;k<2;++k)
tmp[i][j]=(tmp[i][j]+x[i][k]*y[k][j]%mod)%mod;
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
x[i][j]=tmp[i][j];
}
void rec_quick_mod(){
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
res[i][j]=(i==j);
while(n){
if(n&1)mul(res,cur);
n>>=1;
mul(cur,cur);
}
}
int main()
{
scanf("%I64d%I64d%I64d%I64d",&a,&b,&n,&x);
cur[0][0]=a;cur[0][1]=b;cur[1][0]=0;cur[1][1]=1;
rec_quick_mod();
LL ret=(res[0][0]*x%mod+res[0][1])%mod;
printf("%I64d\n",ret);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: