POJ 3734 wata 的快速幂 模板。

来源:互联网 发布:淘宝小蜜投诉有用吗 编辑:程序博客网 时间:2024/05/01 03:47

对于递推。我们可以用矩阵来解决问题,尤其是对于求 第100000000项式多少这种问题时,其实看到数字就应该想到要矩阵了。。

首先是构造矩阵,构造矩阵的方法。。。各种途径都有。。没图不好说。。

反正呢。。

首先是一个目标列向量,然后还有一个原来的列向量。

然后根据递推方程 构造一个 n x n 矩阵

矩阵的数字要看递推方程如果根据上一项得到下一项。

#include <stdio.h>#include <iostream>#include <queue>#include <algorithm>#include <map>#include <vector>#include <cmath>#include <string.h>#include <stdlib.h>#include <time.h>#include <fstream>#include <set>#include <stack>using namespace std;#define READ freopen("acm.in","r",stdin)#define WRITE freopen("acm.out","w",stdout)#define ll long long#define ull unsigned long long #define PII pair<int,int>#define PDI pair<double,int>#define PDD pair<double,double>#define MII map<int,int>::iterator #define fst first#define sec second#define MS(x,d) memset(x,d,sizeof(x))#define INF 0x3f3f3f3f#define ALL(x) x.begin(),x.end()#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define ROOT 0,n-1,1#define PB push_back#define FOR(a,b,c) for(int a=b;a<c;a++)#define MOD 10007#define keyTree (ch[ ch[root][1] ][0])#define MAX 200#define SIG 128typedef vector<int> vec;typedef vector<vec> mat;mat mul(mat &A,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;}}return C;}mat pow(mat A,int n){mat B(A.size(),vec(A.size()));for(int i=0;i<A.size();i++)B[i][i]=1;while(n){if(n&1)B=mul(B,A);A=mul(A,A);n>>=1;}return B;}int solve(int n){mat A(3,vec(3));// 几行 几列A[0][0]=2,A[0][1]=1,A[0][2]=0;A[1][0]=2,A[1][1]=2,A[1][2]=2;A[2][0]=0,A[2][1]=1,A[2][2]=2;A=pow(A,n);return A[0][0];}int main(){int cas;scanf("%d",&cas);//B[0][0]=1,B[0][1]=0,B[0][2]=0;while(cas--){int n;cin>>n;cout<<solve(n)<<endl;}return 0;}


0 0
原创粉丝点击