HDU4565 So Easy!【矩阵快速幂】

来源:互联网 发布:翼龙贷网网络贷款 编辑:程序博客网 时间:2024/05/29 13:17

题意:给出a,b,n,m。求


思路:(a + sqrt(b))^n = Xn + Yn * sqrt(b)

(a+sqrt(b))^(n+1) = (Xn + Yn * sqrt(b)) *(a + sqrt(b)) = aXn+bYn + (Xn+aYn) * sqrt(b)

Xn+1 = aXn+bYn; Yn+1 =(Xn+aYn);

X0 = 1;Y0 = 0


(a + sqrt(b))^n + (a - sqrt(b))^n = 2*Xn

因为a-1 < sqrt(b) < a ,0 < (a - sqrt(b))^n <1

(a + sqrt(b))^n,向上取整 = 2Xn

Sn = 2Xn


#include<stdio.h>#include<iostream>#include<string.h>#include<string>#include<stdlib.h>#include<math.h>#include<vector>#include<list>#include<map>#include<stack>#include<queue>#include<algorithm>#include<numeric>#include<functional>using namespace std;typedef long long ll;const int maxn = 5;int MOD,N,a[maxn];struct data{ll s[maxn][maxn];}res,tp;void init(){memset(res.s,0,sizeof res.s);memset(tp.s,0,sizeof tp.s);for(int i = 1; i <= N; i++)res.s[i][i] = 1;/*for(int i = 1; i <= N; i++){for(int j = 1; j <= N; j++)printf("%d%c",tp.s[i][j],j == N?'\n':' ');}*/}struct data mat(struct data &x,struct data &y){struct data temp;memset(temp.s,0,sizeof temp.s);for(int i = 1; i <= N; i++){for(int j = 1; j <= N; j++){for(int k = 1; k <= N; k++){temp.s[i][j] += x.s[i][k] * y.s[k][j];temp.s[i][j] %= MOD;}}}return temp;}struct data mpow(struct data &a,int b){while(b){if(b&1) res = mat(res,a);b >>= 1;a = mat(a,a); }return res;}int main(void){int n,m,a,b;while(scanf("%d%d%d%d",&a,&b,&n,&m)!=EOF){MOD = m;N = 2;init();tp.s[1][1] = tp.s[2][2] = a;tp.s[1][2] = b;tp.s[2][1] = 1;res = mpow(tp,n);ll ans = 0;ans = 2 * res.s[1][1];ans = ( (ans%MOD)+MOD ) % MOD;printf("%lld\n",ans);}return 0;}



原创粉丝点击