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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【矩阵乘法】OpenJ_POJ - C17F - A Simple Math Problem

發布時間:2023/12/6 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【矩阵乘法】OpenJ_POJ - C17F - A Simple Math Problem 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算(7+4*sqrt(3))^n的整數部分(mod 1e9+7)。

容易想到矩乘快速冪,但是怎么算整數部分呢?

(7+4*sqrt(3))^n一定可以寫成a+b*sqrt(3),同理(7-4*sqrt(3))^n一定可以寫成a-b*sqrt(3),于是,

(7+4*sqrt(3))^n

=?(7+4*sqrt(3))^n +?(7-4*sqrt(3))^n -?(7-4*sqrt(3))^n

= 2*a -?(7-4*sqrt(3))^n/*必然小于1*/

所以其整數部分 = 2*a - 1

#include<vector> #include<cstdio> using namespace std; typedef long long ll; #define MOD 1000000007ll typedef vector<ll> vec; typedef vector<vec> mat; mat I; mat operator * (const mat &a,const mat &b){mat c(a.size(),vec(b[0].size()));for(int i=0;i<a.size();++i){for(int k=0;k<b.size();++k){for(int j=0;j<b[0].size();++j){c[i][j]=(c[i][j]+a[i][k]*b[k][j]%MOD)%MOD;}}}return c; } mat Quick_Pow(mat a,ll p){if(!p){return I;}mat res=Quick_Pow(a,p>>1);res=res*res;if(p&1ll){res=res*a;}return res; } int T,n; int main(){ // freopen("f.in","r",stdin);I.assign(2,vec(2));for(int i=0;i<2;++i){for(int j=0;j<2;++j){if(i==j){I[i][j]=1;}else{I[i][j]=0;}}}mat A(2,vec(2));A[0][0]=7; A[0][1]=12;A[1][0]=4; A[1][1]=7;mat B(2,vec(1));B[0][0]=1;B[1][0]=0;scanf("%d",&T);for(;T;--T){scanf("%d",&n);printf("%lld\n",((Quick_Pow(A,n)*B)[0][0]*2ll%MOD+MOD-1ll)%MOD);}return 0; }

轉載于:https://www.cnblogs.com/autsky-jadek/p/7202801.html

總結

以上是生活随笔為你收集整理的【矩阵乘法】OpenJ_POJ - C17F - A Simple Math Problem的全部內容,希望文章能夠幫你解決所遇到的問題。

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