ZOJ Problem Set - 3690 Choosing number
Chieh
posted @ 2015年8月25日 17:11
in NO Answer No Speak
, 105 阅读
/* Author:Chieh Because Of Coding */ //dp[i]=dp[i-1]*m-s;s=dp[i-1]-s; #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <vector> #include <stack> #include <map> #include <set> #define LL long long #define INF 1e9 #define EPS 1e-9 using namespace std; struct matrix { LL e[2][2]; }; matrix Cal(matrix p,matrix q,int len,int MOD) { matrix c; for(int i=0; i<len; i++) { for(int j=0; j<len; j++) { c.e[i][j]=0; for(int k=0; k<len; k++) { c.e[i][j]=(c.e[i][j]+((p.e[i][k]*q.e[k][j])%MOD))%MOD; } } } return c; } const int MOD=1000000007; int n,m,k; matrix a,s; void init() { for(int i=0; i<2; i++) { for(int j=0; j<2; j++) { if(i==j)s.e[i][j]=1; else s.e[i][j]=0; } } a.e[0][0]=m; a.e[0][1]=1; a.e[1][0]=-k; a.e[1][1]=-1; } void exp_pow(int b) { while(b) { if(b&1)s=Cal(s,a,2,MOD); a=Cal(a,a,2,MOD); b>>=1; } } void play() { exp_pow(n); LL ans=s.e[0][0]; while(ans<0)ans+=MOD; printf("%lld\n",ans); } int main() { while(scanf("%d%d%d",&n,&m,&k)!=EOF) { init(); play(); } // cout << "Hello world!" << endl; return 0; }