首页 > 其他分享 >HDU 1588 Gauss Fibonacci(矩阵快速幂)

HDU 1588 Gauss Fibonacci(矩阵快速幂)

时间:2023-04-13 17:39:05浏览次数:48  
标签:tmp HDU ma matrix int 1588 Gauss init include

题目地址:HDU 1588

用于构造斐波那契的矩阵为

1,1

1,0

设这个矩阵为A。

sum=f(b)+f(k+b)+f(2*k+b)+f(3*k+b)+........+f((n-1)*k+b)

<=>sum=A^b+A^(k+b)+A^(2*k+b)+A^(3*k+b)+........+A^((n-1)*k+b)

<=>sum=A^b+A^b*(A^k+A^2*k+A^3*k+.......+A^((n-1)*k))(1)

设矩阵B为A^k;

那么(1)式为

sum=A^b+A^b*(B+B^2+B^3+......+B^(n-1));

显然,这时候就可以用二分矩阵做了,括号内的就跟POJ 3233的形式一样了。

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL __int64
LL mod;
struct matrix
{
    LL ma[3][3];
}init, res1, res2, ans;
matrix Mult(matrix x, matrix y)
{
    matrix tmp;
    int i, j, k;
    for(i=0;i<2;i++)
    {
        for(j=0;j<2;j++)
        {
            tmp.ma[i][j]=0;
            for(k=0;k<2;k++)
            {
                tmp.ma[i][j]=(tmp.ma[i][j]+x.ma[i][k]*y.ma[k][j])%mod;
            }
        }
    }
    return tmp;
}
matrix Pow(matrix x, int k)
{
    matrix tmp;
    int i, j;
    for(i=0;i<2;i++) for(j=0;j<2;j++) tmp.ma[i][j]=(i==j);
    while(k)
    {
        if(k&1) tmp=Mult(tmp,x);
        x=Mult(x,x);
        k>>=1;
    }
    return tmp;
}
matrix Add(matrix x, matrix y)
{
    int i, j;
    matrix tmp;
    for(i=0;i<2;i++)
    {
        for(j=0;j<2;j++)
        {
            tmp.ma[i][j]=(x.ma[i][j]+y.ma[i][j])%mod;
        }
    }
    return tmp;
}
matrix Sum(matrix x, int k)
{
    if(k==1) return x;
    if(k&1)
        return Add(Sum(x,k-1),Pow(x,k));
    matrix tmp;
    tmp=Sum(x,k>>1);
    return Add(tmp,Mult(tmp,Pow(x,k>>1)));
}
int main()
{
    int k, b, n;
    while(scanf("%d%d%d%d",&k,&b,&n,&mod)!=EOF)
    {
        init.ma[0][0]=1;
        init.ma[0][1]=1;
        init.ma[1][0]=1;
        init.ma[1][1]=0;
        res1=Pow(init,b);
        res2=Pow(init,k);
        ans=Add(res1,Mult(res1,Sum(res2,n-1)));
        printf("%I64d\n",ans.ma[0][1]);
    }
    return 0;
}


标签:tmp,HDU,ma,matrix,int,1588,Gauss,init,include
From: https://blog.51cto.com/u_16070138/6188251

相关文章

  • HDU 3306 Another kind of Fibonacci(矩阵快速幂)
    题目地址:HDU3306没什么智商的题目,只要把构造矩阵硬算出来就行。代码如下:#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<stdlib.h>#include<math.h>#include<ctype.h>#include<queue>#include<......
  • 详解GaussDB(DWS)的query_band负载识别与应用
    摘要:query_band是一个会话级别(session)的GUC参数,本身是字符串类型,支持任意形式字符组合。本文分享自华为云社区《GaussDB(DWS)的query_band负载识别与应用》,作者:门前一棵葡萄树。query_band概述GaussDB(DWS)实现了基于query_band的负载识别和优先级调度,一方面提供了更为灵活......
  • openGauss Datakit安装部署
    一、问题描述:目前找不到任何关于opengauussDatakit安装部署的文档,自己来尝试踩坑。DataKit是一个以资源(物理机,数据库)为底座的开发运维工具,将上层的开发运维工具插件化,各插件之间相互独立,方便用户按需引入。各插件围绕DataKit的资源中心进行扩展开,完成数据库的运维,监控,迁移,开发,建......
  • (KMP 1.1)hdu 1711 Number Sequence(KMP的简单应用——求pattern在text中第一次出现的
    题目:NumberSequenceTimeLimit:10000/5000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):12902    AcceptedSubmission(s):5845ProblemDescriptionGiventwosequencesofnumbers:a[1],a[2],......,a[N],andb[1......
  • opengauss
    环境运行centos7,dockerdocker好久没用了,在操作边学习的道路上,docker大致思路,就是人家开发人员应对版本问题,比如有些要在win7下面的环境,而现在普遍win10/11,不可能环境都能一样,所以由此开发docker容器技术,当然如果硬件不在考虑的范畴centos为什么大多数都是在linux环境下运......
  • hdu-4533(线段树+区间合并)
    约会安排HDU-4553跟hdu-1540(线段树+区间合并)-魏老6-博客园(cnblogs.com)是一样,但是要写两个线段树。线段树维护,最长前缀pre,最长后缀suf,以及最大连续连续区间sum。1代表空,0代表时间被占了还有几个注意事项:当是DS时,只能查询和修改屌丝树;当是NS时,先判断屌丝树能不......
  • openGauss索引优化以及虚拟索引
    一、索引推荐1、测试数据导入gsql-ddatabase_test-p26000-Ujoe-WMysql@123456-rCREATETABLEtab_ysl_1(col1int,col2int,col3text);INSERTINTOtab_ysl_1VALUES(generate_series(1,3000),generate_series(1,3000),repeat(chr(int4(random()*26)+65),4));AN......
  • opengauss数据库启动模式
    一、概述gs_ctl-M-M后面需要跟SERVERMODE参数,表示在启动时指定数据库的启动模式。SERVERMODEare:primarydatabasesystemrunasaprimaryserver,sendxlogtostandbyserverstandbydatabasesystemrunasastandbyserver,receivexlogfrom......
  • openGauss安装问题及解决
    openGauss安装问题及解决安装成功示意图openGauss安装成功结果DataStudio工具安装连接成功结果安装过程中的问题及解决openEuler版本不适配开始的时候用的是openEuler22.03版本,安装过程中明显感觉各种源文件以及目录分布都不同,抱着试一试的心态继续安装。先是出现了下......
  • openGauss体系架构
    一、体系架构图二、Instance部分Instance部分其实主要指的是数据库运行时的内存部分。openGauss属于单进程多线程模型的数据库,客户端可以使用JDBC/ODBC/Libpq/Psycopg等驱动程序,向openGauss的后端管理线程GaussMaster发起连接请求。当GaussMaster线程接收到客户端程序发送过来的......