题面:

传送门

思路:

一眼看上去是三个递推......好像还挺麻烦的

仔细观察一下,发现也就是一个线性递推,但是其中后面的常数项比较麻烦

观察一下,这里面有以下三个递推是比较麻烦的

第一个是$k^2$到$\left(k+1\right)^2$,这一步可以把$\left(k+1\right)^2$展开,变成$k^2+2k+1$

第二、三个是$w$和$z$的递推,这个就直接在转移矩阵里面乘以一个自己就好了

所以我们可以构建这样的状态矩阵:

$\begin{bmatrix}a\lbrack i\rbrack&a\lbrack i+1\rbrack&b\lbrack i\rbrack&b\lbrack i+1\rbrack&c\left[i\right]&c\left[i+1\right]&k^2&k&w&z&1\end{bmatrix}$

转移矩阵见代码

最后快速幂就解决了

Code:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mx 1e16
#define ll long long
using namespace std;
inline ll read(){
ll re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
ll n,MOD;
inline ll pmul(ll l,ll r){
ll re=;if(l<r) swap(l,r);
while(r){
if(r&){
re+=l;
if(re>mx) re%=MOD;
}
r>>=;l=l+l;if(l>mx) l%=MOD;
}
return re%MOD;
}
struct ma{
ll a[][],n,m;
ma(){memset(a,,sizeof(a));n=m=;}
void clear(){memset(a,,sizeof(a));n=m=;}
const ma operator *(const ma &b){
ma re;re.n=n;re.m=b.m;ll i,j,k;
for(i=;i<=n;i++){
for(j=;j<=b.m;j++){
for(k=;k<=m;k++){
re.a[i][j]+=pmul(a[i][k],b.a[k][j]);
re.a[i][j]%=MOD;
}
}
}
return re;
}
const void operator =(const ma &b){
n=b.n;m=b.m;ll i,j;
for(i=;i<=n;i++) for(j=;j<=m;j++) a[i][j]=b.a[i][j];
}
}A,B,ans;
//A={a[k],a[k+1],b[k],b[k+1],c[k],c[k+1],k^2,k,w^k,z^k,1}
/*
matrix B
0 q 0 0 0 0 0 0 0 0 0
1 p 0 1 0 1 0 0 0 0 0
0 0 0 u 0 0 0 0 0 0 0
0 1 1 v 0 1 0 0 0 0 0
0 0 0 0 0 x 0 0 0 0 0
0 1 0 1 1 y 0 0 0 0 0
0 r 0 0 0 0 1 0 0 0 0
0 t 0 0 0 1 2 1 0 0 0
0 0 0 1 0 0 0 0 w 0 0
0 0 0 0 0 1 0 0 0 z 0
0 1 0 0 0 2 1 1 0 0 1
*/
ma ppow(ma x,ma y,ll t){
while(t){
if(t&) x=x*y;
y=y*y;t>>=;
}
return x;
}
int main(){
n=read();MOD=read();
ll p=read(),q=read(),r=read(),t=read(),u=read(),v=read(),w=read(),x=read(),y=read(),z=read();
A.n=;A.m=;
A.a[][]=;A.a[][]=;A.a[][]=;A.a[][]=;A.a[][]=;A.a[][]=;
A.a[][]=A.a[][]=A.a[][]=;A.a[][]=w;A.a[][]=z;
B.n=B.m=;
B.a[][]=;B.a[][]=;B.a[][]=;B.a[][]=;
B.a[][]=p;B.a[][]=q;B.a[][]=;B.a[][]=;B.a[][]=r;B.a[][]=t;B.a[][]=;
B.a[][]=u;B.a[][]=v;B.a[][]=;B.a[][]=;B.a[][]=;
B.a[][]=x;B.a[][]=y;B.a[][]=;B.a[][]=;B.a[][]=;B.a[][]=;B.a[][]=;
B.a[][]=;B.a[][]=;B.a[][]=;
B.a[][]=;B.a[][]=;
B.a[][]=w;B.a[][]=z;
ans=ppow(A,B,n-);
printf("nodgd %lld\nCiocio %lld\nNicole %lld\n",ans.a[][],ans.a[][],ans.a[][]);
}

[luogu1707] 刷题比赛 [矩阵快速幂]的更多相关文章

  1. 华东交通大学2018年ACM“双基”程序设计竞赛 C. 公式题 (2) (矩阵快速幂)

    题目链接:公式题 (2) 比赛链接:华东交通大学2018年ACM"双基"程序设计竞赛 题目描述 令f(n)=2f(n-1)+3f(n-2)+n,f(1)=1,f(2)=2 令g(n ...

  2. (中等) CF 576D Flights for Regular Customers (#319 Div1 D题),矩阵快速幂。

    In the country there are exactly n cities numbered with positive integers from 1 to n. In each city ...

  3. HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )

    题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...

  4. CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂

    772002画马尾 题目连接: http://acm.uestc.edu.cn/#/problem/show/1280 Description 众所周知772002很喜欢马尾,所以他决定画几幅马尾送给 ...

  5. generator 1(2019年牛客多校第五场B题+十进制矩阵快速幂)

    目录 题目链接 思路 代码 题目链接 传送门 思路 十进制矩阵快速幂. 代码 #include <set> #include <map> #include <deque& ...

  6. CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版

    "问题:众所周知772002很喜欢马尾,所以他决定画几幅马尾送给他的女朋友. 772002会画m种马尾,772002还有n张纸,n张纸分别编号1到n,每张纸上只能画一种马尾. 然而77200 ...

  7. Bzoj2510 弱题(矩阵快速幂)

    题面(权限题) 题解 一道概率\(dp\),可以设\(f[i][j]\)表示第\(i\)次操作后,标号为\(j\)的小球的期望个数,那么有: \[ \begin{aligned} &f[i][ ...

  8. 矩阵快速幂(入门) 学习笔记hdu1005, hdu1575, hdu1757

    矩阵快速幂是基于普通的快速幂的一种扩展,如果不知道的快速幂的请参见http://www.cnblogs.com/Howe-Young/p/4097277.html.二进制这个东西太神奇了,好多优秀的算 ...

  9. P3390 【模板】矩阵快速幂

    题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k ...

随机推荐

  1. RabbitMQ使用教程(五)如何保证队列里的消息99.99%被消费?

    1. 前情回顾 RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例 RabbitMQ使用教程(二)RabbitMQ用户管理,角色管理及权限设置 RabbitMQ使用 ...

  2. 更改yum网易、阿里云的yum源

    更改yum源为网易的. 首先备份/etc/yum.repos.d/CentOS-Base.repomv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos ...

  3. js display, visible 区别

    注意: display:none和visible:hidden都能把网页上某个元素隐藏起来,在视觉效果上没有区别,但是在一些DOM操作中两者有区别: display:none ---不为被隐藏的对象保 ...

  4. wepy一些问题和解决方案

    wepy一些问题和解决方案 小程序开发和传统的web开发有相识的地方,但是也有不同的地方,要区分. computed属性名和props属性名重复 如果那个组件的渲染值是重名的computed属性,每次 ...

  5. pycharm永久激活记录

    由于上一年安装的pycharm激活时是用的激活码,有期限的,一直到今年5月4日过期,这两天顺便把版本也更新到最新,一直用的free版,到今天提醒我free快到期了,所以才狠下心来去找解决方案,目前已经 ...

  6. Spring @Transactional 浅谈

    一般当我们在一个方法里面操作多个数据对象的可持久化操作时,我们通常这些操作能够成功一起事务提交成功.默认情况下,数据库处于自动提交模式.每一条语句处于一个单独的事务中,在这条语句执行完毕时,如果执行成 ...

  7. MySQL基础 - 1 数据库基础

    一.数据库基础 1.什么是数据库 1.数据库(database)是保存有组织的数据的容器( 通常是一个文件或一组文件 ) 2.数据库是一个以某种有组织的方式存储的数据集合 注意:数据库软件应该称为DB ...

  8. linux几种文件传输方式

    本文记录linux系统中文件传输的多种方式,留作备忘.linux中文件传输的方式有ftp,scp,rsync,rz,sz等,但各个工具的功能又有所区别: FTP : FTP是文件服务器,可实现文件的上 ...

  9. nginx的缓存服务

    都知道缓存的目的是为了减小服务端的压力,可以在客户端直接取到数据 客户端---------------nginx(代理缓存)------------------服务端 代理缓存的描述: 就是客户端发送 ...

  10. python练手习题

    不断记录python常见习题,不断寻求更多更好的解决办法.持续更新中..... 练习: 1. list两两元素交换位置,如[1,2,3,4,5,6] 执行后为 -> [2,1,4,3,6,5] ...