您的位置:首页 > 产品设计 > UI/UE

7_22_G Yet another Number Sequence(矩阵快速幂)

2016-09-05 09:59 543 查看

7_22_G Yet another Number Sequence

题意

给出数列前两项,按斐波那契数列的方式计算,求第n个数的后几位。

思路

裸的矩阵快速幂取模

代码

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
const int maxn = 4;
const int mod[5] = {0, 10, 100, 1000, 10000};
typedef long long ll;

struct Mat {
int maze[maxn][maxn];
};

int choose;

Mat Mat_mul(const Mat& a, const Mat& b){
Mat res;
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++){
res.maze[i][j] = 0;
for(int k = 0; k < 2; k++) {
res.maze[i][j] += (a.maze[i][k] * b.maze[k][j]) % mod[choose];
}
res.maze[i][j] %= mod[choose];
}
return res;
}

Mat Mat_Qpow(int n){
Mat base,res;
base.maze[0][0] = base.maze[0][1] = base.maze[1][0] = 1;
base.maze[1][1] = 0;

res.maze[0][0] = res.maze[1][1] = 1;
res.maze[0][1] = res.maze[1][0] = 0;
while(n > 0){
if(n & 1) {
res = Mat_mul(res, base);
}
base =
978b
Mat_mul(base, base);
n >>= 1;
}
return res;
}

int main(){
int T;
scanf("%d", &T);
while(T--){
int a ,b,n,chose;
scanf("%d %d %d %d", &a,&b,&n,&choose);
auto ans= Mat_Qpow(n-1);
if(n == 0) {ans.maze[0][0] = 0 ; ans.maze[0][1] = 1;}
else if(n == 1) {ans.maze[0][0] = 1 ; ans.maze[0][1] = 0;}

printf("%d\n", (ans.maze[0][0] * b + ans.maze[0][1] *a) % mod[choose]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: