您的位置:首页 > 其它

POJ 3734 wata 的快速幂 模板。

2014-03-19 23:14 357 查看
对于递推。我们可以用矩阵来解决问题,尤其是对于求 第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 128

typedef 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: