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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

HDU 3306 Another kind of Fibonacci 矩阵快速幂

發布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 3306 Another kind of Fibonacci 矩阵快速幂 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接


因為S(N) , S(N) = A(0)^2 +A(1)^2+……+A(n)^2.所以構造的矩陣一定要維護A(n)^2

s[n-1]=s[n-2]+A[n-1]^2

A[n]=x*A[n-1]+y*A[n-2]

A[n]^2=x^2*A[n-1]+y^2*A[n-2]+2*x*y*A[n-1]*A[n-2]

所以說還要維護A[n-1]*A[n-1]

這個遞推過來發現A[n]*A[n-1]=(x*A[n-1]+y*A[n-2])*A[n-1]=x*(A[n-1]^2)+y*A[n-1]*A[n-2]

如果還不明白 看看對應的表

?A[n-1]^2A[n]^2A[n]*A[n-1]S[n-1]
A[n-2]^20y*y0

0

A[n-1]^21x*xx1
A[n-1]*A[n-2]02*x*yy0
S[n-2]0001

然后我們就把對應關系列出來了

變換矩陣X就是上述4*4的表

初始矩陣ans為A[0],A[1],A[0]*A[1],S[0];

求S[n],ans=qmod(X,n);

A'C代碼:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define inff 0x3f3f3f3f
#define lowbit(x) x&(-x)
#define PI 3.14159265358979323846
#define min4(a,b,c,d) min(min(a,b),min(c,d))
#define min3(x,y,z) min(min(x,y),min(y,z))
#define pii make_pair
#define pr pair<int,int>
const int dir[4][2]={0,1,0,-1,1,0,-1,0};
typedef long long ll;
const ll inFF=9223372036854775807;
typedef unsigned long long ull;
using namespace std;
const ll mod=10007;
ll n,x,y;
struct mat///自己定義大小的矩陣
{ll m[4][4];
};
mat mulmat(mat A,mat B)///兩個矩陣相乘
{mat C;memset(C.m,0,sizeof(C.m));for(int i=0;i<4;i++)for(int j=0;j<4;j++)for(int k=0;k<4;k++)C.m[i][j]=(C.m[i][j]+A.m[i][k]*B.m[k][j])%mod;return C;
}
ll qmod_mat(mat A,ll b)///A為變換矩陣,b為冪
{mat ans;memset(ans.m,0,sizeof(ans.m));///給自己的初始矩陣賦值,一般初始矩陣和變換矩陣都是固定的ans.m[0][0]=ans.m[0][1]=ans.m[0][2]=ans.m[0][3]=1;while(b){if(b&1) ans=mulmat(ans,A);A=mulmat(A,A);b>>=1;}return ans.m[0][3];///最后的矩陣,答案
}
int main()
{while(cin>>n>>x>>y){mat A;memset(A.m,0,sizeof(A.m));A.m[1][0]=A.m[1][3]=A.m[3][3]=1;A.m[0][1]=y*y%mod,A.m[1][1]=x*x%mod;A.m[2][1]=2*x*y%mod;A.m[1][2]=x%mod,A.m[2][2]=y%mod;printf("%lld\n",qmod_mat(A,n));}return 0;
}

?

總結

以上是生活随笔為你收集整理的HDU 3306 Another kind of Fibonacci 矩阵快速幂的全部內容,希望文章能夠幫你解決所遇到的問題。

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