hdu4565 so easy 矩阵
来源:互联网 发布:詹姆斯职业生涯总数据 编辑:程序博客网 时间:2024/05/17 17:17
的确和题目描述一样,见过这个类型就so easy了
对于这个类型,首先化为二阶通项公式的类型,然后根据特征根反过来推递推方程就行
然而无脑的我还是调了一个晚上,就因为写乘法的时候忘记return了
然后就写了两个版本的,其实并没有多大不同
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>#define LL long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define down(i,a,b) for(int i=a;i>=b;i--)using namespace std;LL inf;#define N 2struct matrix{ LL a[N][N]; void clear() { fo(i,0,N-1) fo(j,0,N-1) a[i][j]=0; } matrix operator*(const matrix b) { matrix anss; fo(i,0,N-1) fo(j,0,N-1) { anss.a[i][j]=0; fo(k,0,N-1) { anss.a[i][j]=(anss.a[i][j]+a[i][k]*b.a[k][j])%inf; anss.a[i][j]+=inf;anss.a[i][j]%=inf; } anss.a[i][j]+=inf;anss.a[i][j]%=inf; } return anss; }};matrix I={ 1,0, 0,1};LL a,b,n;matrix KSM(matrix a,LL b){ if(b==0)return I; if(b==1)return a; matrix ret=KSM(a,b/2); ret=ret*ret; if(b%2)ret=ret*a; return ret;}int main(){ matrix A,anss; while(cin>>a>>b>>n>>inf) { if(n==1) { cout<<(2*a%inf)<<endl; continue; } A.clear();anss.clear(); A.a[0][0]=2*a%inf; A.a[0][1]=((b%inf-a*a%inf)%inf+inf)%inf; A.a[1][0]=1; A.a[1][1]=0; anss=KSM(A,n-2); cout<<(((anss.a[0][0]%inf*2*(a*a%inf+b%inf)%inf+2*a%inf*anss.a[0][1]%inf)%inf+inf)%inf)<<endl; } return 0;}
还有就是看起来精简好多的
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>#define LL long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define down(i,a,b) for(int i=a;i>=b;i--)using namespace std;LL inf;#define N 2struct matrix{ LL a[N][N]; void clear() { fo(i,0,N-1) fo(j,0,N-1) a[i][j]=0; } matrix operator*(const matrix b) { matrix anss; fo(i,0,N-1) fo(j,0,N-1) { anss.a[i][j]=0; fo(k,0,N-1) { anss.a[i][j]=((anss.a[i][j]+a[i][k]*b.a[k][j])%inf+inf)%inf; } } return anss; }};matrix I={ 1,0, 0,1};LL a,b,n;matrix KSM(matrix a,LL b){ matrix ret=a,p=a;b--; while(b) { if(b&1) { ret=ret*p; b--; } p=p*p; b>>=1; } return ret;}int main(){ matrix A,anss; while(cin>>a>>b>>n>>inf) { if(n==1) { cout<<(2*a%inf)<<endl; continue; } anss.clear(); A.a[0][0]=2*a; A.a[0][1]=b-a*a; A.a[1][0]=1; A.a[1][1]=0; anss=KSM(A,n-1);// cout<<anss.a[0][0]<<' '<<anss.a[0][1]<<endl;// cout<<anss.a[1][0]<<' '<<anss.a[1][1]<<endl; LL ans=(anss.a[0][0]*2*a+anss.a[0][1]*2)%inf; ans+=inf;ans%=inf; cout<<ans<<endl; } return 0;}
0 0
- hdu4565---So Easy!(矩阵)
- HDU4565 So Easy! (矩阵)
- hdu4565 so easy 矩阵
- HDU4565 So Easy!【矩阵连乘】【推导】
- hdu4565 So Easy!(矩阵快速幂)
- HDU4565 So Easy!【矩阵快速幂】
- HDU4565 So Easy!
- HDU4565 So Easy!
- 20130707 hdu4565 So Easy! 数学头脑+矩阵快速幂
- HDU4565 So Easy! 矩阵快速幂外加数学
- HDU4565-So Easy!(共轭运用+矩阵快速幂)
- HDU4565 So Easy!(数学+矩阵快速幂)
- HDU4565-So easy-数学推导化简递推矩阵快速幂
- HDU4565---So Easy!(矩阵快速幂(精度控制))
- hdu4565 So Easy! 广义斐波那契+矩阵快速幂+共轭构造
- So Easy! ——————hdu4565(矩阵快速幂)
- HDU4565/2013年长沙赛区So easy
- 2013长沙赛区第一题 HDU4565—So Easy!
- ubuntu技巧--ubuntu下升级cmake
- iOS公司开发者账号申请
- Floyd算法(弗洛伊德算法) 百度百科
- 网络原理,以及对VMware Workstation虚拟网络VMnet0、VMnet1、VMnet8的图解
- 公共字串计算
- hdu4565 so easy 矩阵
- 对比: Java EE EJB和 Spring Java Bean
- 如何在android studio中实现自定义view
- 欢迎使用CSDN-markdown编辑器
- python元编程--装饰器函数
- HDU 3853 LOOPS(概率DP简单题)
- Android内存分析
- Android-百度地图-定位功能
- 线性回归——Stanford Machine Learning (1)