7.22 F uva 10870 Recurrences

来源:互联网 发布:mac照片无法访问iphone 编辑:程序博客网 时间:2024/05/22 06:46

题意:f(n)=a*f(n-1)+b*f(n-2)+c*f(n-3)...,输入给定范围的n,输出f(n)。

思路:矩阵快速幂。

代码:

//coder:OX_louis#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <cmath>#include <cstdlib>#include <ctime>#include <stack>using namespace std;typedef pair<int, int> pii;typedef long long ll;typedef unsigned long long ull;typedef vector<int> vi;#define MP(a,b) make_pair(a,b)#define pr(x) cout << #x << ": " << x << "  "#define pl(x) cout << #x << ": " << x << endl;#define pri(a) printf("%d\n",(a))#define xx first#define yy second#define sa(n) scanf("%d", &(n))#define sal(n) scanf("%lld", &(n))#define sai(n) scanf("%I64d", &(n))#define vep(c) for(decltype((c).begin() ) it = (c).begin(); it != (c).end(); it++)#define rep(i,a,b) for(int (i)=(a); (i)<(b); (i)++)#define per(i,a,b) for(int (i)=(b)-1; (i)>=(a); (i)--)#define CLR(a,i) memset((a),(i),sizeof(a))ll n,m;int d;struct Mat{    ll v[15][15];}mat[35],init;Mat mt(Mat a,Mat b){    Mat ans;    rep(i,0,d)    rep(j,0,d){        ans.v[i][j]=0;        rep(k,0,d){            ans.v[i][j]=(ans.v[i][j]+(a.v[k][j]*b.v[i][k])%m)%m;        }    }    return ans;}Mat k_pow(int n){    Mat ans=init;    if(n==0)return ans;    int i=1;    while(n){        if(n&1){            ans=mt(ans,mat[i]);        }        i++;        n=n>>1;    }    return ans;}int main(){    ios::sync_with_stdio(0);    while(cin>>d>>n>>m){        if(!d&&!n&&!m)break;        rep(i,0,d){            cin>>mat[1].v[0][i];            mat[1].v[0][i]%=m;            if(i) mat[1].v[i][i-1]=1;        }        rep(i,0,d)            cin>>init.v[d-1-i][0];        if(n<=d) {cout<<init.v[d-n][0]<<endl;continue;}         rep(i,1,34){            mat[i+1]=mt(mat[i],mat[i]);        }        n-=d;        Mat ans=k_pow(n);        cout<<ans.v[0][0]<<endl;    }    return 0;}


0 0
原创粉丝点击