首页 > 代码库 > 【矩阵乘法】OpenJ_POJ - C17F - A Simple Math Problem
【矩阵乘法】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; }
【矩阵乘法】OpenJ_POJ - C17F - A Simple Math Problem
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。