1605: 数字序列
时间限制: 1 Sec 内存限制: 60 MB提交: 830 解决: 193
题目描述
一个数列的定义如下:
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
给出A和B,你要求出f(n).
输入
输入包含多个测试案例。每个测试用例包含3个整数A,B和n在一行(1<=A,B≤1000,1≤n≤100000000)。
当输入三个0表示结束
输出
对于每个测试案例,输出f(n),单独占一行。
样例输入
1 1 3
1 2 10
0 0 0
样例输出
2
5
题解:快速幂矩阵,可以构造出矩阵
A | B |
1 | 0 |
然后套入模板。注意输出结果是哪一个。
笔记:转移矩阵就是系数矩阵,构造的时候f(n)和f(n+1)的时候不用加系数,矩阵就是系数。
OS:又一个快速幂的题,我还是不会。呜呜~
我第一次写的矩阵是
A | A |
A/B | 0 |
这咋有个除法,心态崩了。后来知道了系数矩阵。
#include<bits/stdc++.h> using namespace std; #define MOD 7 #define ll long long int const int N=2; long long tmp[N][N]; void multi(ll a[][N],ll b[][N],ll n,ll m) //矩阵运算 { memset(tmp,0,sizeof(tmp)); for(int i=0;i<m;i++) for(int j=0;j<m;j++) for(int k=0;k<m;k++) { tmp[i][j]=((a[i][k]*b[k][j])%MOD+tmp[i][j])%MOD; } for(int i=0;i<m;i++) for(int j=0;j<m;j++) { a[i][j]=tmp[i][j]; } } ll res[N][N];//存放结果的数组 void Pow(ll a[][N],ll n,ll m) { memset(res,0,sizeof res); //n是幂,m是矩阵大小 for(int i=0;i<m;i++) res[i][i]=1; //单位矩阵 while(n) { if(n%2==1) { multi(res,a,n,m);//res=res*a;复制直接在multi里面实现了; } multi(a,a,n,m);//a=a*a n=n/2; } } int main() { ll nn=2,A,B,mm; while(~scanf("%lld%lld%lld",&A,&B,&mm)&&A!=0&&B!=0&&mm!=0) { //nn为矩阵大小,mm为幂。 mm=mm-2; ll aa[2][2]={A,B,1,0}; Pow(aa,mm,nn); ll res1=(res[0][0]+res[0][1])%MOD; printf("%lld\n",res1); } return 0; }