日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

generator 1【矩阵快速幂】

發布時間:2025/3/8 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 generator 1【矩阵快速幂】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述
You are given four positive integers x0,x1,a,bx_0, x_1, a, bx0?,x1?,a,b. And you know xi=a?xi?1+b?xi?2x_i = a \cdot x_{i-1} + b \cdot x_{i-2}xi?=a?xi?1?+b?xi?2? for all i≥2i \ge 2i2.

Given two positive integers n, and MOD, please calculate xnx_nxn? modulo MOD.

Does the problem look simple? Surprise! The value of n may have many many digits!

輸入描述:
The input contains two lines.
The first line contains four integers x0,x1,a,bx_0, x_1, a, bx0?,x1?,a,b (1≤x0,x1,a,b≤109)(1 \le x_0, x_1, a, b \le 10^9)(1x0?,x1?,a,b109)
The second line contains two integers nnn, MOD (1≤n&lt;10(106),109&lt;MOD≤2×109,nhasnoleadingzero)(1 \le n &lt; 10^{(10^6)}, 10^9 &lt; MOD \le 2 \times 10^9 , n\ has\ no\ leading\ zero)(1n<10(106),109<MOD2×109,n?has?no?leading?zero).

輸出描述:
Print one integer representing the answer.

示例1
輸入
1 1 1 1
10 1000000001
輸出
89
說明
The resulting sequence x is Fibonacci sequence. The 11-th item is 89.

示例2
輸入
1315 521 20185 5452831
9999999999999999999999999999999999999 1000000007
輸出
914730061

題目大意:
已知公式xi=a?xi?1+b?xi?2x_i=a \cdot x_{i-1} + b \cdot x_{i-2}xi?=a?xi?1?+b?xi?2?
第一行輸入x0,x1,a,bx_0,x_1,a,bx0?,x1?,a,b
第二行輸入n,pn,pn,p
xn%px_n\%pxn?%p的值

解題思路:
由于此題nnn的數據范圍很大,而且又知道公式,所以可以很容易想到是矩陣快速冪的裸題,但由于nnn的范圍很大,所以需將二進制的快速冪寫法改為十進制。
由于xi=a?xi?1+b?xi?2x_i=a \cdot x_{i-1} + b \cdot x_{i-2}xi?=a?xi?1?+b?xi?2?
所以
∣xn+1xn00∣=∣x0x100∣?∣a1b0∣n\begin{vmatrix} x_{n+1} &amp; x_n \\ 0 &amp; 0 \end{vmatrix}=\begin{vmatrix} x_0 &amp; x_1 \\ 0 &amp; 0 \end{vmatrix}*\begin{vmatrix} a &amp; 1 \\ b &amp; 0 \end{vmatrix}^n?xn+1?0?xn?0??=?x0?0?x1?0????ab?10??n
因此直接敲矩陣快速冪即可。

代碼:

#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <cstdlib> #include <cstring> #include <map> #include <stack> #include <queue> #include <vector> #include <bitset> #include <set> #include <utility> #include <sstream> #include <iomanip> using namespace std; typedef long long ll; typedef unsigned long long ull; #define inf 0x3f3f3f3f #define rep(i,l,r) for(int i=l;i<=r;i++) #define lep(i,l,r) for(int i=l;i>=r;i--) #define ms(arr) memset(arr,0,sizeof(arr)) //priority_queue<int,vector<int> ,greater<int> >q; const int maxn = (int)1e5 + 5; const ll mod = 1e9+7; struct node {ll arr[2][2];node() {ms(arr);} }; ll p; node mul(node a,node b) {node c;for(int i=0;i<2;i++) {for(int j=0;j<2;j++) {for(int k=0;k<2;k++) {c.arr[i][j]=(c.arr[i][j]+(a.arr[i][k]*b.arr[k][j])%p)%p;}}}return c; } char str[1001000]; node b1,base; int len; ll quickpow() {for(int i=len-1;i>=0;i--) {int x=(int)(str[i]-'0');node nape2;nape2.arr[0][0]=base.arr[0][0];nape2.arr[0][1]=base.arr[0][1];nape2.arr[1][0]=base.arr[1][0];nape2.arr[1][1]=base.arr[1][1];while(x) {if(x&1) b1=mul(b1,nape2);nape2=mul(nape2,nape2);x>>=1;}node nape1=mul(base,base);base=mul(base,base);base=mul(base,base);base=mul(base,base);base=mul(nape1,base);}return b1.arr[0][1]%p; } int main() {#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);#endif//freopen("out.txt", "w", stdout);//ios::sync_with_stdio(0),cin.tie(0); ll x0,x1,a,b;scanf("%I64d %I64d %I64d %I64d",&x0,&x1,&a,&b);scanf("%s",str);scanf("%I64d",&p);base.arr[0][0]=a;base.arr[0][1]=1LL;base.arr[1][0]=b;base.arr[1][1]=0;b1.arr[0][0]=x1;b1.arr[0][1]=x0;b1.arr[1][0]=0;b1.arr[1][1]=0;len=strlen(str);printf("%I64d\n",quickpow());return 0; }

總結

以上是生活随笔為你收集整理的generator 1【矩阵快速幂】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。