题目描述

输入

输出

样例输入

5 97

样例输出

11

提示

 
 
 

题解

先不管p,通过列举前面几项,不难发现当i为偶数时,a[i]=a[i-1]+a[i-2],当i为奇数时,a[i]=a[i-1]+a[i-2]+1,具体证明还不会,希望有大佬能在讨论区讲讲

知道了a[i]的通项后,我们可以通过矩阵乘法的快速幂log(n)来求出答案。

具体怎么做,我们可以两项两项的来做,最后再判断一下n的奇偶性就可以了。

不过我是用3维矩阵来做的

刚开始的ans为

0 0 0
0 0 0
1 2 1

ans[3][1]表示a[i-1],ans[3][2]表示a[i]

tmp为

1 1 0
1 2 0
1 1 1

刚开始Matrix_pow(n/2-1,p),具体为什么是这样可以代一个n=2进去,这样Matrix_pow不会做,再判断n为偶数,那么答案就是ans[3][2],发现是正确的

 
做完Matrix_pow后,判断n为奇数就再乘一个矩阵temp为

0 1 0
1 1 0
0 1 1

最后答案就是ans[3][2]

不过这里你要特判一下n=0和n=1的情况,我就是被n=0给坑了,害得我找了1个小时的错
 #include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,p;
ll tmp[][],temp[][],ans[][],c[][];
void Matrix_mul(ll a[][],ll b[][]){
for (int i=;i<=;i++)
for (int j=;j<=;j++){
c[i][j]=;
for (int k=;k<=;k++)
c[i][j]=(c[i][j]+a[i][k]%p*b[k][j]%p)%p;
}
}
void Matrix_pow(ll n){
while (n>){
if (n%){
Matrix_mul(ans,tmp);
memcpy(ans,c,sizeof(ans));
}
Matrix_mul(tmp,tmp);
memcpy(tmp,c,sizeof(tmp));
n>>=;
}
}
int main(){
scanf("%lld%lld",&n,&p);
if (!n||n==){ printf("%lld\n",%p); return ; }
tmp[][]=; tmp[][]=; tmp[][]=; tmp[][]=; tmp[][]=; tmp[][]=; tmp[][]=;
ans[][]=; ans[][]=; ans[][]=;
temp[][]=; temp[][]=; temp[][]=; temp[][]=; temp[][]=;
Matrix_pow(n/-);
if (n%){
Matrix_mul(ans,temp);
memcpy(ans,c,sizeof(ans));
}
printf("%lld\n",ans[][]);
return ;
}

YYHS-Floor it的更多相关文章

  1. SQL Server 随机数,随机区间,随机抽取数据rand(),floor(),ceiling(),round(),newid()函数等

    在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数.那就看下面 ...

  2. SQL中Round(),Floor(),Ceiling()函数的浅析

    项目中的一个功能模块上用到了标量值函数,函数中又有ceiling()函数的用法,自己找了一些资料,对SQL中这几个函数做一个简单的记录,方便自己学习.有不足之处欢迎拍砖补充 1.round()函数遵循 ...

  3. 精灵方向移动问题[math.floor]

    local xd = math.cos(math.rad(self._direction));--self._direction方向角度 local yd = math.sin(math.rad(se ...

  4. javascript中针对float的ceil及floor

    function floorFloat(num, precision) { return +(Math.floor(+(num + 'e' + (precision))) + 'e' + -(prec ...

  5. 函数floor(n)

    Matlab函数floor(n): 仅取整数部分,剔除小数部分 例如: floor(9.2)=9; 仅此

  6. mathlab之floor,ceil,round,int以及fix函数

    建议自己动手敲敲,网上很多人自己都没搞清楚然后好多错的.毕竟自己亲眼看到结果才有说服力. 以下是我亲眼见到的结果. 1.double floor(double)函数 floor()函数是常用的取整函数 ...

  7. JavaScript的几种Math函数,random(),ceil(),round(),floor()

    1.Math.random():返回 0 ~ 1 之间的随机数.2.Math.ceil():返回值:返回大于或等于x,并且与之最接近的整数(如果x是正数,则把小数"入":如果x是负 ...

  8. php函数 ceil floor round和 intval

    1.ceil 如果有小数部分 则进一位 < ?php echo ceil(4.3); echo ceil(9.999); ?> 2.floor 舍小取整 < ? php echo f ...

  9. 报错注入分析之(count()、rand()、group by)分析,被大佬称为floor报错注入

    PS:在这几天的学习当中很多的文章都将此注入方式称之为“floor报错分析”但经过我这几天的学习.个人觉得不该如此称呼!若君有意请详细阅读此篇文章.特别感谢米怀特的开导,说句实在的研究这个注入有四天了 ...

  10. 如何在一个页面后面随机跳转到多个链接地址Math.floor()和Math.random()

    点击一个标签随机跳转到多个链接地址,主要运用javascript中的Math.floor()和Math.random()方法 floor(x) 方法是向下去整数 参数为任意数值或表达式. floor( ...

随机推荐

  1. go环境的安装~

    Golang环境搭建 Golang github地址:https://github.com/golang/go Golang的环境下载:https://golang.org/dl/ 安装过程就是nex ...

  2. statement和preparedstatement的区别

    在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象.无论多少次地使用同一个SQL命令,PreparedStatement都只对它解析和 ...

  3. 微服务时代之2017年五军之战:Net PHP谁先死

    其实我一直是个懒人,开博也有好几年了,但是一直懒得写文章,主要怕打字麻烦, 手机都是用讯飞语音输入的, 可惜博客里面很多专业性的词语,用讯飞也不大好,另外无论在家还是在公司,开个语音一本正经的叽叽叽, ...

  4. 原创:Docker在云家政的应用 谢绝复制粘贴内容

    我们公司目前大规模使用了Docker,目前除了数据库应用,其他所有应用都在Docker容器内运行,下面我就Docker在公司的应用做一些分享.. 首先我介绍一下公司的背景,公司属于中小型创业公司,服务 ...

  5. SQL查询四舍五入 解决方法

    方法1: SELECT CAST('123.456' as decimal) 将会得到 123(小数点后面的将会被省略掉). 如果希望得到小数点后面的两位. 则需要把上面的改为 SELECT CAST ...

  6. centos7.1磁盘分区 格式化 挂载

    1.fdisk -l 查看磁盘状态 2.将 /dev/sdb 分区 fdisk /dev/sdb 3.对分区进行格式化 mkfs -t ext3 /dev/sdb 4.挂载/dev/sdb 到/hom ...

  7. BotVS开发基础—2.11 API绘制图表

    代码 import time chart = { '__isStock': True, # 标记是否为一般图表,有兴趣的可以改成 false 运行看看. 'tooltip': {'xDateForma ...

  8. Spring详解(二)------IOC控制反转

    我相信提到 Spring,很多人会脱口而出IOC(控制反转).DI(依赖注入).AOP等等概念,这些概念也是面试官经常问到的知识点.那么这篇博客我们就来详细的讲解 IOC控制反转. ps:本篇博客源码 ...

  9. 接口测试 mock server 工具moco学习笔记

    看过乙醇分享的接口测试,自己练习了moco,这里呢,吧一些练习的笔记坐下记录,方便自己查阅. 开源地址https://github.com/dreamhead/moco  ,  到QuickStart ...

  10. 堆排序—Java

    堆排序: 一棵完全二叉树,如果父节点的值大于等于左右节点的值,则称此完全二叉树为小根堆(小顶堆):如果父节点的值小于等于左右节点的值,则次完全二叉树为大根堆(大顶堆). 堆排序是建立在大顶堆或小顶堆的 ...