题目:3231: [Sdoi2008]递归数列

题意:

一个由自然数组成的数列按下式定义:
 
对于i <= k:ai = bi
对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k
其中bjcj1<=j<=k)是给定的自然数。写一个程序,给定自然数m <= n, 计算am + am+1 + am+2 + ... + an, 并输出它除以给定自然数p的余数的值。 1<= k<=15,1 <= m <= n <= 10^18
本题主要是构造矩阵,然后就直接矩阵连乘即可。
 
构造的上述矩阵的i大于k,当i小于k时就直接加起来就行。
 
这样am + am+1 + am+2 + ... + an=S(n)-S(m-1)
 
代码:
#include <iostream>
#include <string.h>
#include <stdio.h> using namespace std;
typedef long long LL;
const int MAXN=25; struct Matrix
{
LL m[MAXN][MAXN];
}; LL b[MAXN],c[MAXN];
LL K,M,N,P;
Matrix a,per; void Init()
{
int i,j;
for(i=0;i<=K;i++)
for(j=0;j<=K;j++)
per.m[i][j]=(i==j);
} Matrix multi(Matrix a,Matrix b)
{
Matrix c;
int i,j,k;
for(i=0;i<=K;i++)
{
for(j=0;j<=K;j++)
{
c.m[i][j]=0;
for(k=0;k<=K;k++)
c.m[i][j]+=a.m[i][k]*b.m[k][j]%P;
c.m[i][j]%=P;
}
}
return c;
} Matrix matrix_mod(LL n)
{
Matrix ans=per,p=a;
while(n)
{
if(n&1)
{
ans=multi(ans,p);
n--;
}
n>>=1;
p=multi(p,p);
}
return ans;
} int main()
{
int i,j;
Init();
LL ret1,ret2,S;
Matrix ans;
while(cin>>K)
{
ret1=ret2=0;
for(i=0;i<K;i++)
cin>>b[i];
for(i=0;i<K;i++)
cin>>c[i];
cin>>M>>N>>P;
for(i=0;i<K;i++)
{
b[i]%=P;
c[i]%=P;
}
for(i=0;i<=K;i++)
{
for(j=0;j<=K;j++)
{
a.m[i][j]=0;
if(i==0&&j==0) a.m[i][j]=1;
if(i==0&&j>0) a.m[i][j]=c[j-1];
if(i==1&&j>0) a.m[i][j]=c[j-1];
if(i>1) a.m[i][j]=(i==(j+1));
}
}
S=0;
for(i=0;i<K;i++)
{
S+=b[i];
S%=P;
}
if(N<=K)
{
for(i=0;i<=N-1;i++)
{
ret1+=b[i];
ret1%=P;
}
}
else
{
ans=matrix_mod(N-K);
ret1=ans.m[0][0]*S%P;
for(i=1;i<=K;i++)
{
ret1+=ans.m[0][i]*b[K-i]%P;
ret1%=P;
}
}
if(M-1<=K)
{
if(M>=2)
for(i=0;i<=M-2;i++)
{
ret2+=b[i];
ret2%=P;
}
if(M<2) ret2=0;
}
else
{
ans=matrix_mod(M-K-1);
ret2=ans.m[0][0]*S%P;
for(i=1;i<=K;i++)
{
ret2+=ans.m[0][i]*b[K-i]%P;
ret2%=P;
}
}
cout<<((ret1-ret2)%P+P)%P<<endl;
}
return 0;
}


 

BZOJ3231(矩阵连乘,稍有点复杂)的更多相关文章

  1. 如果你喜欢python,那你迟早会喜欢上julia的!

    你可曾想过有那么一门语言: 这门语言能够有C语言一样的速度,Ruby一样得活力(dynamism).像homoiconic一样的语言,它像Lisp一样有宏,但是也像Matlab一样有显而易见.熟悉的数 ...

  2. [2017BUAA软工助教]团队beta得分总表

    一.累计得分 项目 α例会 α发布 α测试 α展示 α事后 合计 满分 50 10 10 150 10 230 hotcode5 50 10 9 150 9 228 弗朗明哥舞步 50 10 8 13 ...

  3. BZOJ-3231 递归数列 矩阵连乘+快速幂

    题不是很难,但是啊,人很傻啊...机子也很鬼畜啊... 3231: [Sdoi2008]递归数列 Time Limit: 1 Sec Memory Limit: 256 MB Submit: 569 ...

  4. [bzoj3231][SDOI2008]递归数列——矩阵乘法

    题目大意: 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj ...

  5. 【bzoj3231】[Sdoi2008]递归数列 矩阵乘法+快速幂

    题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj  ...

  6. 【BZOJ-3243】向量内积 随机化 + 矩阵

    3243: [Noi2013]向量内积 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1249  Solved:  ...

  7. (转)投影矩阵的推导(Deriving Projection Matrices)

    转自:http://blog.csdn.net/gggg_ggg/article/details/45969499 本文乃<投影矩阵的推导>译文,原文地址为: http://www.cod ...

  8. 用状态矩阵解决有序操作的case爆炸问题(转载)

    转自http://qa.baidu.com/blog/?p=167 作者:qabloger 一. 简介 我们在测试中可能都会面对case爆炸问题.有的case组合是无序的,我们可以通过pict[1]组 ...

  9. OpenCL 矩阵乘法

    ▶ 矩阵乘法,按照书里的内容进行了几方面的优化,包括局部内存,矢量数据类型,寄存器,流水线等. ● 最直接的乘法.调用时 main.c 中使用 size_t globalSize[] = { rowA ...

随机推荐

  1. K-means算法[聚类算法]

    聚类算法k-Means的实现 <?php /* *Kmeans法(聚类算法的实现) */ /* *求误差平方和J */ //----------------------------------- ...

  2. Use API to retrieve data from internet

    Reference: Working with APIs Many big companies and organizations provide API for us to retrieve dat ...

  3. [Java]使用队列求解josephus问题

    约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环. 有个囚犯站成一个圆圈,准备处决.首先从一个人开始,越过个人(因为第一个人已 ...

  4. Xcode GDB 命令list

    此文下半部分为转载:但是这里有一些我自己使用技巧,结合下面的文章,我们会有更多的收获,在此感谢原创者.     --------------------- 关于调试异常崩溃: 一般崩溃是由内存使用错误 ...

  5. 在Windows环境下部署Axis2/C服务

    Apache Axis2/C是C语言实现的网络服务引擎,基于Axis2架构,支持SOAP1.1和SOAP1.2协议,并且支持RESTful风格的Web service. 下面是本人在Windows 7 ...

  6. JS 节流阀

    JS 节流阀 参考 https://github.com/hahnzhu/read-code-per-day/issues/5 节流阀 节流阀的基本原理 事件函数的执行都记下当前时间, 只有当前时间与 ...

  7. MYSQL 退出的三个方式

    方式1: exit 方式2: quit 方式3: \q

  8. 什么是LED锡膏?

    LED锡膏熔点172℃,俗称中温锡膏,其合金为Sn64Bi35Ag1,此类产品是含Bi类的低熔点无铅锡膏,加入Ag改变了SnBi合金的焊点的机械强度.大幅度提高焊点可靠性,适用于高频调谐器系列产品的贴 ...

  9. Html 小插件3

    搜狗搜索框代码 <script>function verifyquery(form){if(form.sogou_drop.value==2){form.insite.value='';} ...

  10. 第25周五迷茫定位&转行理论建议

    今天下午请假办了无房证明和单身证明,准备开始贷款买房的征程,在犹豫纠结中我选择推进这个事情,之前的经验告诉我生活中可以面临改变或不改变境况的选择是要尽可能的选择改变,因为我还年轻.回来后知乎上看了一个 ...