uva10689yet another number sequence矩阵快速幂
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87585#problem/C
题意:输入斐波那契前2个数a,b,以及n,k,输出第n个数模10的k次方。
思路:基础矩阵运用,矩阵快速幂。
#include<iostream> using namespace std; typedef long long ll; struct Matrix { ll v[2][2]; }; Matrix m; Matrix mul(Matrix a,Matrix b,ll mod) { Matrix c; c.v[0][0]=(a.v[0][0]*b.v[0][0]+a.v[0][1]*b.v[1][0])%mod;c.v[0][1]=(a.v[0][0]*b.v[0][1]+a.v[0][1]*b.v[1][1])%mod; c.v[1][0]=(a.v[1][0]*b.v[0][0]+a.v[1][1]*b.v[1][0])%mod;c.v[1][1]=(a.v[1][0]*b.v[0][1]+a.v[1][1]*b.v[1][1])%mod; return c; } Matrix pow(Matrix a,ll n,ll mod) { if(n==1)return a; Matrix e=pow(a,n>>1,mod); if(n%2)return mul(mul(e,e,mod),m,mod); else return mul(e,e,mod); } ll dpow(ll k) { ll a=1; for(int i=0;i<k;i++) { a*=10; } return a; } int main() { m.v[0][0]=0;m.v[0][1]=1; m.v[1][0]=1;m.v[1][1]=1; ll c,a,b,n,k; cin>>c; while(c) { cin>>a>>b>>n>>k; ll mod=dpow(k); if(n==0){cout<<a%mod;continue;} if(n==1){cout<<b%mod;continue;} Matrix ans=pow(m,n-1,mod); cout<<(a*ans.v[0][1]%mod+b*ans.v[1][1]%mod)%mod<<endl; c--; } return 0; }