• 题目链接:

    https://www.luogu.org/problemnew/show/P1707

  • 分析:

    洛谷的一道原创题,对于练习矩阵加速递推非常不错。

    首先我们看一下递推式:

    \(a[k+2]=p*a[k+1]+q*a[k]+b[k+1]+c[k+1]+r*k^2+t*k+1;\)

    \(b[k+2]=u*b[k+1]+v*b[k]+a[k+1]+c[k+1]+w^k;\)

    \(c[k+2]=x*c[k+1]+y*c[k]+a[k+1]+b[k+1]+z^k+k+2;\)

    有点吓人,我想在做这道题的人都能对类似\(p*a[k+1]\)都能进行转移矩阵的构建,主要我们处理后面这些。

    设\(f[k]=k^2\)

    则\(f[k+1]=(k+1)^2=f[k]+2*k+1;\)

    设\(g[k]=k\)

    则\(g[k+1]=g[k]+1;\)

    设\(h[k]=w^k\)

    则\(h[k+1]=h[k]*w;\)

    设\(p[k]=z^k\)

    则\(p[k+1]=p[k]*z;\)

    设\(q[k]=x*k\)

    则\(q[k+1]=q[k]+x;\)

    然后就全都转化成线性递推,搞一个状态矩阵:

    \(ans={a2,a1,b2,b1,c2,c1,f[k],g[k],h[k],p[k],k,1}\)

    转移矩阵:

    \({p,q,1,0,1,0,r,0,0,0,t,1}\)

    \({1,0,0,0,0,0,0,0,0,0,0,0}\)

    \({1,0,u,v,1,0,0,0,1,0,0,0}\)

    \({0,0,1,0,0,0,0,0,0,0,0,0}\)

    \({1,0,1,0,x,y,0,0,0,1,1,2}\)

    \({0,0,0,0,1,0,0,0,0,0,0,0}\)

    \({0,0,0,0,0,0,1,0,0,0,2,1}\)

    \({0,0,0,0,0,0,0,1,0,0,0,1}\)

    \({0,0,0,0,0,0,0,0,w,0,0,0}\)

    \({0,0,0,0,0,0,0,0,0,z,0,0}\)

    \({0,0,0,0,0,0,0,0,0,0,1,1}\)

    \({0,0,0,0,0,0,0,0,0,0,0,1}\)

    好了,你就可以开始了。

    然而有个很毒瘤的地方:你可能需要快速乘

    然后一开始我不知道在这里卡了好久

    我只想说

    这题对于一个蒟蒻而言太毒瘤了!!!

  • 代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn=17;
ll N,k;
int p,q,r,t,u,v,w,x,y,z;
ll q_mul(ll a,ll b)
{
ll ans=0;
while(b)
{
if(b&1) ans=(ans+a)%k;
a=(a+a)%k;
b>>=1;
}
return ans;
}
struct Matrix{
int n,m;
ll ma[maxn][maxn];
Matrix(int _n){n=m=_n;memset(ma,0,sizeof(ma));for(register int i=1;i<=n;i++)ma[i][i]=1;}
Matrix(int _n,int _m){n=_n,m=_m;memset(ma,0,sizeof(ma));}
Matrix(){;}
Matrix operator *(const Matrix &b)const{
Matrix ans=Matrix(n,b.m);
for(register int i=1;i<=n;i++){
for(register int j=1;j<=b.m;j++){
ll tmp=0;
for(register int o=1;o<=m;o++){
tmp+=q_mul(ma[i][o],b.ma[o][j]);//(ma[i][o]%k*b.ma[o][j]%k)%k;
//if(tmp>1000000)tmp=tmp%k;
}
ans.ma[i][j]=tmp%k;
}
}
return ans;
}
Matrix operator ^(const ll& C)const {
ll c=C;
Matrix res=*this;
Matrix ans=Matrix(n);
while(c){
if(c&1)ans=ans*res;
res=res*res;
c=c>>1;
}
return ans;
}
};
void print(ll x)//输出
{
if(x<0)
{
x =-x;
putchar('-');
}
if(x>9) print(x/10);
putchar(x%10+'0');
}
int main(){
scanf("%lld %lld %d %d %d %d %d %d %d %d %d %d",&N,&k,&p,&q,&r,&t,&u,&v,&w,&x,&y,&z);
Matrix ans=Matrix(12,1);
ans.ma[1][1]=3,ans.ma[2][1]=1,ans.ma[3][1]=3,ans.ma[4][1]=1,ans.ma[5][1]=3,ans.ma[6][1]=1;
ans.ma[7][1]=1,ans.ma[8][1]=1,ans.ma[9][1]=w,ans.ma[10][1]=z,ans.ma[11][1]=1,ans.ma[12][1]=1; Matrix A=Matrix(12,12);
A.ma[1][1]=p,A.ma[1][2]=q,A.ma[1][3]=1,A.ma[1][5]=1,A.ma[1][7]=r,A.ma[1][11]=t,A.ma[1][12]=1;
A.ma[2][1]=1;
A.ma[3][1]=1,A.ma[3][3]=u,A.ma[3][4]=v,A.ma[3][5]=1,A.ma[3][9]=1;
A.ma[4][3]=1;
A.ma[5][1]=1,A.ma[5][3]=1,A.ma[5][5]=x,A.ma[5][6]=y,A.ma[5][10]=1,A.ma[5][11]=1,A.ma[5][12]=2;
A.ma[6][5]=1;
A.ma[7][7]=1,A.ma[7][11]=2,A.ma[7][12]=1;
A.ma[8][8]=A.ma[8][12]=1;
A.ma[9][9]=w,A.ma[10][10]=z,A.ma[11][11]=A.ma[11][12]=1,A.ma[12][12]=1;
A=A^(N-2);
ans=A*ans;
printf("nodgd %lld\nCiocio %lld\nNicole %lld",ans.ma[1][1],ans.ma[3][1],ans.ma[5][1]);
return 0;
}

luogu题解 P1707 【刷题比赛】矩阵加速递推的更多相关文章

  1. P1707 刷题比赛

    P1707 刷题比赛 10通过 38提交 题目提供者nodgd 标签倍增递推矩阵洛谷原创 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 不科学 题目背景 nodgd是一个喜欢写程序的同学, ...

  2. [洛谷P1707] 刷题比赛

    洛谷题目连接:刷题比赛 题目背景 nodgd是一个喜欢写程序的同学,前不久洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家-- ...

  3. bzoj2004公交线路——DP+矩阵加速递推

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 求方案数,想到DP: 因为两个站间距离<=p,所以每p个站中所有车一定都会停靠至 ...

  4. [luogu1707] 刷题比赛 [矩阵快速幂]

    题面: 传送门 思路: 一眼看上去是三个递推......好像还挺麻烦的 仔细观察一下,发现也就是一个线性递推,但是其中后面的常数项比较麻烦 观察一下,这里面有以下三个递推是比较麻烦的 第一个是$k^2 ...

  5. [HDU2294] Pendant - 矩阵加速递推

    Pendant Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  6. 矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)

    https://www.vijos.org/p/1067 非常easy推出递推式f[n] = f[n-1]+f[n-2]+......+f[n-k]. 构造矩阵的方法:构造一个k*k的矩阵.当中右上角 ...

  7. [模板][题解][Luogu1939]矩阵乘法加速递推(详解)

    题目传送门 题目大意:计算数列a的第n项,其中: \[a[1] = a[2] = a[3] = 1\] \[a[i] = a[i-3] + a[i - 1]\] \[(n ≤ 2 \times 10^ ...

  8. 【csp模拟赛3】bridge.cpp--矩阵加速递推

    题目描述 穿越了森林,前方有一座独木桥,连接着过往和未来(连接着上一题和下一题...). 这座桥无限长. 小 Q 在独木桥上彷徨了.他知道,他只剩下了 N 秒的时间,每一秒的时间里,他会向 左或向右移 ...

  9. POJ3070 Fibonacci(矩阵快速幂加速递推)【模板题】

    题目链接:传送门 题目大意: 求斐波那契数列第n项F(n). (F(0) = 0, F(1) = 1, 0 ≤ n ≤ 109) 思路: 用矩阵乘法加速递推. 算法竞赛进阶指南的模板: #includ ...

随机推荐

  1. 宝塔linux面板,phpmyadmin进不去的处理方法

    1.检查宝塔面板是否开始phpmyadmin是否开启 2.打开阿里云安全组,添加888/888端口

  2. Asp.Net WebAPI 通过HttpContextBase或者HttpRquest 获取请求参数

    WEBAPI中的Request是HttpRequestMessage类型,不能像Web传统那样有querystring和from 方法接收参数,而传统的HttpReqest的基类是HttpReqest ...

  3. cygwin下make指令不存在 & cmd也能用make的配置方法

    最近做毕设需要使用Mask R-CNN,就配置了相关环境,在安装pycocotools时要make,于是决定用cygwin来做.但在路径下make时出现了问题: bash错误:make指令不存在.一番 ...

  4. 最简SpringBoot程序制法

    JDK:1.8.0_212 IDE:STS4(Spring Tool Suit4 Version: 4.3.2.RELEASE) 工程下载:https://files.cnblogs.com/file ...

  5. 手把手教你 iOS通过自己的服务器实现应用分发

    第一步:打包ipa 1:可以是development.ad-hoc.enterprise任何一种打包方式,导出的ipa, 稍后会将安装包上传到服务器上. 2:如下图,箭头指的要打勾 3.点击下一步后出 ...

  6. WCF的CommunicationObjectFaultedException异常问题

    前天刚刚重装了系统,装上了Win7,结果在调试的时候,WCF服务Open报错了! 具体错误信息如下: System.ServiceModel.CommunicationObjectFaultedExc ...

  7. 5、kubernetes资源清单定义入门

    使用配置清单创建资源 定义pod时使用yaml格式 master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE client / Error 1 ...

  8. Autofac实现AOP拦截

    本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截. Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题.AO ...

  9. MybatisPlus使用代码篇

    package spring.server.consumer; import com.baomidou.mybatisplus.annotation.DbType; import com.baomid ...

  10. office web apps安装部署,配置https,负载均衡(二)域控制器安装并配置域账号

    域控制器对服务器的要求不高,我们这里以windows server 2008R2为例 系统要求:windows server 2008R2 笔者也尝试使用了windows server 2012R2, ...