zoukankan      html  css  js  c++  java
  • 矩阵幂和——hdu1588

    矩阵
    A^1+A^2+A^3...A^6
    =(A^2+ret)*(A^1+A^2+A^3);
    =(A^2+ret)*(A*(ret+A)+A^3);
     
    如果是A^1+A^3+A^5...
    =A*(ret+A^2+A^4..)
    即把A^2+A^4...看成A^k+A^2k...
    View Code
    #include<stdio.h>
    #include
    <string.h>

    __int64 mod;
    __int64 n;

    struct data
    {
    __int64 map[
    3][3];
    };
    data res;

    data add(data a,data b)
    //矩阵加
    {
    data re;
    int i,j;
    for(i=0;i<n;i++)
    {
    for(j=0;j<n;j++)
    {
    re.map[i][j]
    =(a.map[i][j]+b.map[i][j])%mod;
    }
    }
    return re;
    }

    data mul(data a,data b)
    //矩阵乘
    {
    __int64 i,j,k;
    data re;
    for(i=0;i<n;i++)
    {
    for(j=0;j<n;j++)
    {
    __int64 all
    =0;
    for(k=0;k<n;k++)
    {
    all
    +=(a.map[i][k]*b.map[k][j])%mod;
    all
    %=mod;
    }
    re.map[i][j]
    =all%mod;
    }
    }
    return re;
    }

    data mi(data f,__int64 p)
    //矩阵求幂
    {
    __int64 i,j;
    data all;
    for(i=0;i<n;i++){
    for(j=0;j<n;j++){
    all.map[i][j]
    =0;
    if(i==j)all.map[i][j]=1;
    }
    }

    while(p>0)
    {
    if((p&1)==1)
    {all
    =mul(all,f);}

    f
    =mul(f,f);
    p
    >>=1;
    }

    return all;
    }

    data full(data a,__int64 p)
    //矩阵A^1+A^2+A^3...A^p
    {
    data d;
    if(p==1)return a;
    elseif(p&1)
    {
    return add(full(a,p-1),mi(a,p));
    }
    else
    {
    return mul(full(a,p>>1),add(mi(a,p>>1),res));
    }
    }

    int main()
    {
    __int64 p,k,b,num;
    n
    =2;
    while(scanf("%I64d%I64d%I64d%I64d",&k,&b,&num,&mod)!=EOF)
    {
    __int64 i,j;
    data f;
    f.map[
    0][0]=0;
    f.map[
    0][1]=1;
    f.map[
    1][0]=1;
    f.map[
    1][1]=1;
    res.map[
    0][0]=1;
    res.map[
    0][1]=0;
    res.map[
    1][0]=0;
    res.map[
    1][1]=1;

    __int64 all
    =0;
    if(k==0)
    {
    data temp
    =mi(f,k);
    all
    =((temp.map[0][1]%mod)*num)%mod;
    }
    else
    {
    data bi
    =mi(f,k);
    data ci
    =mi(f,b);
    data temp
    =full(bi,num-1);
    temp
    =add(temp,res);
    temp
    =mul(temp,ci);
    all
    =temp.map[0][1];
    }
    printf(
    "%I64d\n",all%mod);


    }
    return0;
    }

      

  • 相关阅读:
    监考
    初步确定五一粤东出行计划
    煤矿粉尘监控系统中心站软件3层设计
    c# 程序调用代码生成数据库
    Socket 一个服务器监听多个客户端 功能实现
    软件开发进度表
    sql server日期时间格式转换字符串简介
    Sql建表和sql语句的注意事项
    分布式设计与开发(一)宏观概述
    分布式设计与开发(四)数据拆分
  • 原文地址:https://www.cnblogs.com/huhuuu/p/2116318.html
Copyright © 2011-2022 走看看