按部就班,超级简单,虽然不是一次过的。。。错在那个long long数据问题还是要注意。。也不知道要怎么注意;还是说题目吧。。。

思路看main函数

其他函数功能也是非常有用!代码比较丑。。。见谅

#include <stdio.h>

#include <iostream>

#include <sstream>

#include <string.h>

#include <math.h>

#include<stdlib.h>

#include <queue>

#include <set>

#include <algorithm>

using namespace std;

long long mod;

struct asd{

    long long a[4][4];

};

asd ak;                   //代表A的k次

asd mul(asd x,asd y)      //矩阵乘法

{

    int i,j,k;

    asd ans;

    for(i=0;i<2;i++)

    {

        for(j=0;j<2;j++)

        {

            ans.a[i][j]=0;

            for(k=0;k<2;k++)

            {

                ans.a[i][j]+=(x.a[i][k]*y.a[k][j])%mod;

                ans.a[i][j]%=mod;

            }

        }

    }

    return ans;

}

asd add(asd x,asd y)   //矩阵加法

{

    int i,j,k;

    asd ans;

    for(i=0;i<2;i++)

    {

        for(j=0;j<2;j++)

        {

            ans.a[i][j]=(x.a[i][j]+y.a[i][j])%mod;

        }

    }

    return ans;

}

asd quick(asd y,long long g)   //快速幂

{

    asd x;

    int i,k,j;

    for(i=0;i<2;i++)

    {

        for(j=0;j<2;j++)

        {

            if(i==j)

                x.a[i][i]=1;

            else

                x.a[i][j]=0;

        }

    }

    while(g)

    {

        if(g%2==1)

            x=mul(x,y);

        y=mul(y,y);

        g/=2;

    }

    return x;

}

asd slove(long long z)    //计算S(n);S(n)代表A的1次加到A的n次;

{

    if(z==1)

        return ak;

    asd ans=slove(z/2);

    asd cur;

    if(z%2==1)

    {

        cur=quick(ak,z/2+1);

        ans=add(ans,mul(ans,cur));

        ans=add(cur,ans);

    }

    else

    {

        cur=quick(ak,z/2);

        ans=add(ans,mul(ans,cur));

    }

    return ans;

}

/*反正就想算数一样,斐波那契的那个矩阵肯定知道(不知道出门左转去学一下矩阵快速幂),假设是A,那么也就是题目要求

就是计算A的0+b次到A的k(n-1)+b次的和,次数的相加拆开就是相乘(不知道去复读初中),那么,把A的b次提出来,A^b(E+A^K+A^2K+...A^(n-1)K)

然后把A^K看作整体就是什么!!!还不知道看main函数代码。。草稿纸上列一列就知道了。。。

*/

int main()

{

    long long k,b,n;

    while(~scanf("%lld%lld%lld%lld",&k,&b,&n,&mod))

    {

        asd fb,ea,ans,y,sk;

        ea.a[0][0]=1;ea.a[0][1]=0;   //单位矩阵

        ea.a[1][0]=0;ea.a[1][1]=1;

        y.a[0][0]=1;y.a[0][1]=1;

        y.a[1][0]=1;y.a[1][1]=0;

        fb=quick(y,b);         //求一个A的b次

        ak=quick(y,k);          //求一个A的K次

        sk=slove(n-1);          //求S(K);

        sk=add(sk,ea);          //把没加的E加上

        ans=mul(sk,fb);         //乘一波

        printf("%lld\n",ans.a[0][1]);    //这里还是看你的线代怎么样了。。

    }

    return 0;

}





hdoj 1588 学好线代与数学的更多相关文章

  1. NYOJ 67 三角形面积(线代,数学)

    三角形面积 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 给你三个点,表示一个三角形的三个顶点,现你的任务是求出该三角形的面积   输入 每行是一组测试数据,有6个 ...

  2. 山东理工大学第七届ACM校赛-飞花的线代 分类: 比赛 2015-06-26 10:29 10人阅读 评论(0) 收藏

    飞花的线代 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 飞花壕的线代一直非常的壕(好),线代考试每次都是全班第一.一次,飞花壕在预习 ...

  3. 线代笔记 #01# 几何水平上的理解 VS. 数值水平上的理解

    源: 线性代数的本质 内容来自字幕. Let me quote without further comment from Dieudonné's "Foundations of Modern ...

  4. numpy--深度学习中的线代基础

    参考自 微信公众号--深度学习世界(http://mp.weixin.qq.com/s?__biz=MzI4MDMwMDM3NA==&mid=2247484616&idx=1& ...

  5. 线代: N阶行列式

    线性变换 将 (x, y) 变成 (2 x + y, x - 3 y) 就叫做线性变换, 这就是矩阵乘法, 用于表示一切线性变换. 几何上看, 把平面上的每个点 (x, y) 都变到 (2 x + y ...

  6. back propogation 的线代描述

    参考资料: 算法部分: standfor, ufldl  : http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial 一文弄懂BP:https: ...

  7. 线代第六章定义&定理整理(持续更新中)

    Chapter 6 6.1 Inner Products and Norms Definition (inner product). Let V be a vector space over F. A ...

  8. 数据挖掘 与 Web开发何去何从

    (0)引子 以下以现实生活中的一个实例引出本博客的探究点.或许类似的情况正发生在你的身边. 小弟工作5年了,近期有点迷茫. 上一份工作在一家比較大的门户站点做web开发和移动互联网数据挖掘(人手比較紧 ...

  9. Python 矩阵(线性代数)

    Python 矩阵(线性代数) 这里有一份新手友好的线性代数笔记,是和深度学习花书配套,还被Ian Goodfellow老师翻了牌. 笔记来自巴黎高等师范学院的博士生Hadrien Jean,是针对& ...

随机推荐

  1. C++代码书写模板 -- 如何判断函数类型

    先说一个简单的方案. 经过验证 g++ 和 vs2010 都可以.原理就是利用函数类型可以直接转换成函数指针. template<class T> bool test( T * t ) { ...

  2. (转) 实现wince datagrid 上下滑屏数据浏览

    开发 基于wince 手持设备数据库应用时 由于是触摸屏 当datagrid 数据过多 往往用户烦于去控制又窄又细的上下滚动条 尤其是高分辨率的屏上 (如魅族M8系统 720×480) 而且datag ...

  3. Time To First Byte (TTFB) 第一字节时间 页面加载时间

    Time to first byte - Wikipedia https://en.wikipedia.org/wiki/Time_to_first_byte Time to first byte ( ...

  4. linux定期判断网站可否打开

      wget http://www.shopindream.de/200.php --timeout=2 c_monitor=$? rm -rf 200.php if [ ! $c_monitor = ...

  5. STM32 ~ JTAG、SWD和串口下载的问题

    最近有一个项目用到STM32,为了使PCB布线方便一些所以改了一些引脚,占用了JTAG接口的PA15和PB3,所以要禁用一下JTAG,下载采用SWD模式.这样在实际操作中做出一些总结(方法网上都有.这 ...

  6. [noi2002]M号机器人

    3030年,Macsy正在火星部署一批机器人.第1秒,他把机器人1号运到了火星,机器人1号可以制造其他的机器人.第2秒,机器人1号造出了第一个机器人——机器人2号.第3秒,机器人1号造出了另一个机器人 ...

  7. HDU3605 Escape —— 二分图多重匹配

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others)    ...

  8. (转)Java经典设计模式(2):七大结构型模式(附实例和详解)

    原文出处: 小宝鸽 总体来说设计模式分为三大类:创建型模式.结构型模式和行为型模式. 博主的上一篇文章已经提到过创建型模式,此外该文章还有设计模式概况和设计模式的六大原则.设计模式的六大原则是设计模式 ...

  9. java连接oracle的几种方式

    jdbc连接(驱动包ojdbc6.jar)String driver = "oracle.jdbc.OracleDriver"; //驱动标识符 String url = &quo ...

  10. html5--4-5 embed元素及其他

    html5--4-5 embed元素及其他 学习要点 掌握embed元素的使用 了解object元素的使用 温馨提示:关于video和audio的事件方法等涉及都JavaScript知识的内容,暂时不 ...