题目: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. ImageView 各种工具类

    package imageUtil; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOut ...

  2. java 数组插入元素

    import java.util.Arrays; public class AddArray { public static void main(String[] args) { int[] arr ...

  3. Android Listview切换动画,扩展到任意view切换之间动画实现

    添加布局如下: <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2010 ...

  4. python request模块学习

    安装: pip install requests 使用: import requests HTTP请求:GET.POST.PUT.DELETE.HEAD.OPTIONS 1) get res = re ...

  5. 初识C(1)----与C基本无关的开篇

    1.啥叫编程 编程乃编写程序的简称,所以要想知道啥叫编程,首先要清楚什么是程序(Program). 普及一点计算机小知识:从根本上说,计算机是由数字电路组成的运算机器,处理的数字也仅限于0和1组成的数 ...

  6. Html 小插件7 新闻免费代码

    http://rss.cnfol.com/freecode/ 定制方法图:

  7. mysql null值问题

    mysql> create table test( sn int, -> `createdTime` datetime NOT NULL COMMENT '创建时间', -> `up ...

  8. hdoj 5319 Painter(模拟题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5319 思路分析:假设颜色R表示为1,颜色B表示为2,颜色G表示为3,因为数据量较小,采用暴力解法即可, ...

  9. Java程序栈信息文件中的秘密(五)

    最近发现在使用jstack工具在导出Java应用的线程栈时有一个小小的窍门,比如Linux环境上有一个用户为appuser,假如以这个用户启动了一个Java进程B,如果想要导出进程B的线程栈,则必须切 ...

  10. 移动互联与大数据之美-逐浪CMS2 X1.1发布

    北京时间2013年7月1日: 领先的CMS研发软件厂商--上海逐浪CMS软件科技有限公司发布其年中重要更新,并以Zoomla!逐浪CMS2 X1.1为版本号向全球用户投递新版软件. 此次更新包括: 1 ...