bzoj 3231: [Sdoi2008]递归数列【矩阵乘法】
今天真是莫名石乐志
一眼矩阵乘法,但是这个矩阵的建立还是挺有意思的,就是把sum再开一列,建成大概这样

然后记!得!开!long!long!!
#include<iostream>
#include<cstdio>
using namespace std;
const int N=20;
long long n,b[N],c[N],sum,l,r,mod;
struct jz
{
long long a[N][N];
jz operator * (const jz &b) const
{
jz c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
c.a[i][j]=0;
for(int k=1;k<=n;k++)
c.a[i][j]=(c.a[i][j]+a[i][k]*b.a[k][j]%mod)%mod;
}
return c;
}
}y;
long long wk(long long x)
{
if(x<n)
{
long long r=0;
for(int i=1;i<=x;i++)
r=(r+b[i])%mod;
return r;
}
x-=n-1;
// cerr<<endl<<x<<endl;
jz a=y,r;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
r.a[i][j]=i==j;
while(x)
{
if(x&1)
r=r*a;
a=a*a;
x>>=1;
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=n;j++)
// cerr<<r.a[i][j]<<" ";
// cerr<<endl;
// }
long long ans=r.a[1][1]*sum%mod;
for(int i=2;i<=n;i++)
ans=(ans+r.a[1][i]*b[n-i+1]%mod)%mod;
return ans;
}
int main()
{
scanf("%lld",&n);
n++;
for(int i=1;i<n;i++)
scanf("%lld",&b[i]);
for(int i=1;i<n;i++)
scanf("%lld",&c[i]);
for(int i=2;i<=n;i++)
y.a[1][i]=y.a[2][i]=c[i-1];
y.a[1][1]=1;
for(int i=3;i<=n;i++)
y.a[i][i-1]=1;
scanf("%lld%lld%lld",&l,&r,&mod);
for(int i=1;i<n;i++)
sum=(sum+b[i])%mod;
// for(int i=1;i<=10;i++)
// cerr<<wk(i)<<endl;
printf("%lld\n",(wk(r)-wk(l-1)+mod)%mod);
return 0;
}
bzoj 3231: [Sdoi2008]递归数列【矩阵乘法】的更多相关文章
- bzoj 3231 [Sdoi2008]递归数列——矩阵乘法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3231 矩阵乘法裸题. 1018是10^18.别忘了开long long. #include& ...
- BZOJ 3231: [Sdoi2008]递归数列( 矩阵快速幂 )
矩阵乘法裸题..差分一下然后用矩阵乘法+快速幂就可以了. ----------------------------------------------------------------------- ...
- BZOJ 3231: [Sdoi2008]递归数列 (JZYZOJ 1353) 矩阵快速幂
http://www.lydsy.com/JudgeOnline/problem.php?id=3231 和斐波那契一个道理在最后加一个求和即可 #include<cstdio> #i ...
- [bzoj3231][SDOI2008]递归数列——矩阵乘法
题目大意: 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj ...
- 【bzoj3231】[Sdoi2008]递归数列 矩阵乘法+快速幂
题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj ...
- [luogu2461 SDOI2008] 递归数列 (矩阵乘法)
传送门 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai- ...
- P2461 [SDOI2008]递归数列 矩阵乘法+构造
还好$QwQ$ 思路:矩阵快速幂 提交:1次 题解: 如图: 注意$n,m$如果小于$k$就不要快速幂了,直接算就行... #include<cstdio> #include<ios ...
- bzoj 3231 [ Sdoi 2008 ] 递归数列 —— 矩阵乘法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3231 裸矩阵乘法. 代码如下: #include<iostream> #incl ...
- BZOJ:3231: [Sdoi2008]递归数列
题解: 矩阵乘法,在矩阵中构造当前前缀和: 注意:for(int/long long ;;); #include<iostream> #include<cstdio> #inc ...
随机推荐
- NRF24L01注意点
nrf24L01被设置为接收模式后,可通过6个不同的数据通道(data pipe)接收数据. 每个数据通道都有一个唯一的地址但是各数据通道的频率是相同的.这意味着可以有6个被配置成发送状态的nRF24 ...
- JS判断滚动条是否停止滚动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [NOIP2005] 提高组 洛谷P1051 谁拿了最多奖学金
题目描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1 ...
- hdu - 2660 Accepted Necklace (二维费用的背包问题)
http://acm.hdu.edu.cn/showproblem.php?pid=2660 f[v][u]=max(f[v][u],f[v-1][u-w[i]]+v[i]; 注意中间一层必须逆序循环 ...
- UVA 1347_Tour
题意: 给定一系列按x坐标升序排列的点,一个人从左向右走到终点再从终点走回起点,要求每个点恰好经过一次,问所走过的最短路径长度. 分析: 可以看成是两个人同时从起点向终点走,且除起点终点外每个点恰有一 ...
- Spring在Java Filter注入Bean为Null的问题解决
在Spring的自动注入中普通的POJO类都可以使用@Autowired进行自动注入,但是除了两类:Filter和Servlet无法使用自动注入属性.(因为这两个归Web容器管理)可以用init(集承 ...
- Why we have tuple and list in python
The most notable difference between tuple and list is that tuple is immutable and list is mutable. B ...
- Android应用程序安装过程浅析
我们知道在android中.安装应用是由PackageManager来管理的,可是我们发现PackageManager是一个抽象类.他的installPackage方法也没有详细的实现. 那在安装过程 ...
- Tcl脚本调用高层API实现仪表使用和主机创建配置的自己主动化測试用例
#设置Chassis的基本參数,包含IP地址.port的数量等等 set chassisAddr 10.132.238.190 set islot 1 set portList {11 12} ;#端 ...
- JSP简单练习-包装类综合应用实例
<%@ page contentType="text/html; charset=gb2312" %><!-- JSP指令标签 --> <%@ pag ...