hdu 4990 矩阵快速幂
2017-03-24 14:48
197 查看
递推公式:f(n)=2*f(n-2)+f(n-1)+1
数据量太大 矩阵快速幂
#include <cstdio>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
long long int mod;
const int m = 3;
struct Matrix
{
long long int mat[3][3];
};
Matrix mul(Matrix a,Matrix b)//Matrix为结构体类型
{
Matrix C;
memset(C.mat,0,sizeof(C.mat));
for(int i=0; i<m; i++) //m,m,m不一定相同
for(int j=0; j<m; j++)
for(int k=0; k<m; k++)
/*c.m[i][k]+=((a.m[i][j]*b.m[j][k])%MOD)%MOD;
c.m[i][k]%=MOD;*/
C.mat[i][j]=(C.mat[i][j]+(a.mat[i][k]%mod)*(b.mat[k][j]%mod))%mod;
return C;
}
Matrix power(Matrix a,int x)
{
Matrix ret;
memset(ret.mat,0,sizeof(ret.mat));
for(int i=0; i<m; i++)
ret.mat[i][i]=1;
while(x)
{
if(x&1)ret=mul(ret,a);
a=mul(a,a);
x=x/2;
}
return ret;
}
int main()
{
long long int n;
Matrix a,b;
while(cin>>n>>mod)
{
memset(a.mat,0,sizeof(a.mat));
memset(b.mat,0,sizeof(b.mat));
a.mat[0][0] = 1;
a.mat[0][1] = 2;
a.mat[0][2] = 1;
b.mat[0][1] = 2;
b.mat[1][0] = 1;
b.mat[1][1] = 1;
b.mat[2][1] = 1;
b.mat[2][2] = 1;
if(n == 1) cout<<n%mod<<endl;
if(n == 2) cout<<n%mod<<endl;
if(n>2){
b = power(b,n-2);
a = mul(a,b);
cout<<a.mat[0][1]%mod<<endl;
}
//printf("%d\n", fast_mod(n));
}
return 0;
}
数据量太大 矩阵快速幂
#include <cstdio>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
long long int mod;
const int m = 3;
struct Matrix
{
long long int mat[3][3];
};
Matrix mul(Matrix a,Matrix b)//Matrix为结构体类型
{
Matrix C;
memset(C.mat,0,sizeof(C.mat));
for(int i=0; i<m; i++) //m,m,m不一定相同
for(int j=0; j<m; j++)
for(int k=0; k<m; k++)
/*c.m[i][k]+=((a.m[i][j]*b.m[j][k])%MOD)%MOD;
c.m[i][k]%=MOD;*/
C.mat[i][j]=(C.mat[i][j]+(a.mat[i][k]%mod)*(b.mat[k][j]%mod))%mod;
return C;
}
Matrix power(Matrix a,int x)
{
Matrix ret;
memset(ret.mat,0,sizeof(ret.mat));
for(int i=0; i<m; i++)
ret.mat[i][i]=1;
while(x)
{
if(x&1)ret=mul(ret,a);
a=mul(a,a);
x=x/2;
}
return ret;
}
int main()
{
long long int n;
Matrix a,b;
while(cin>>n>>mod)
{
memset(a.mat,0,sizeof(a.mat));
memset(b.mat,0,sizeof(b.mat));
a.mat[0][0] = 1;
a.mat[0][1] = 2;
a.mat[0][2] = 1;
b.mat[0][1] = 2;
b.mat[1][0] = 1;
b.mat[1][1] = 1;
b.mat[2][1] = 1;
b.mat[2][2] = 1;
if(n == 1) cout<<n%mod<<endl;
if(n == 2) cout<<n%mod<<endl;
if(n>2){
b = power(b,n-2);
a = mul(a,b);
cout<<a.mat[0][1]%mod<<endl;
}
//printf("%d\n", fast_mod(n));
}
return 0;
}
相关文章推荐
- [矩阵快速幂] hdu 4990 Reading comprehension
- HDU 4990 (找规律 矩阵快速幂)
- HDU 4990 Reading comprehension(找规律+矩阵快速幂)
- hdu 4990 矩阵快速幂
- HDU 4990 Reading comprehension(找规律+矩阵快速幂)
- HDU 4990 Reading comprehension(找规律+矩阵快速幂)
- HDU 4990 Reading comprehension(找规律+矩阵快速幂)
- hdu 4990 Reading comprehension 矩阵快速幂
- HDU 4990 Reading comprehension(找规律+矩阵快速幂)
- HDU 4990 Reading comprehension(找规律+矩阵快速幂)
- HDU 4990 Reading comprehension(找规律+矩阵快速幂)
- hdu 4990 Reading comprehension (矩阵快速幂)
- HDU 4990 Reading comprehension 矩阵快速幂
- HDU 4990 Reading comprehension(矩阵快速幂)
- Reading comprehension HDU - 4990(矩阵快速幂)
- HDU 4990 Reading comprehension(找规律+矩阵快速幂)
- HDU 4990 Reading comprehension(找规律+矩阵快速幂)
- HDU 4990 Reading comprehension(找规律+矩阵快速幂)
- hdu4990——Reading comprehension(矩阵快速幂)
- HDU 4990 Reading comprehension(找规律)(矩阵快速幂)