题目: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. ZOJ 3741 Eternal Reality

    Eternal Reality Time Limit: 2 Seconds                                      Memory Limit: 65536 KB In ...

  2. Linux中的盘符问题

    在windows 中像 C.D.E.F这些都可以当盘符,就是说对应了我们所看到的C盘,D盘,E盘,F盘.然而是不是只能加26个硬盘了呢? 盘符到硬盘也只是一个对映关系,我们也是可以建立从一个文件夹到一 ...

  3. Windows phone 8.1 MessageBox 变了哦!

    using Windows.UI.Popups; public async void MessageBoxShow(string content, string caption) { MessageD ...

  4. linux下通过脚本实现自动重启程序的方法

    无论什么程序都不可能完美无缺,理论上,任何程序都有 Core Dump 的一天,正式运营的程序,尤其是服务器程序,一旦 Core Dump ,后果不堪设想,有过服务器开发经验的朋友,一定都经历过深夜美 ...

  5. ThinkPHP 3 的CURD介绍

    本节课大纲: 一.ThinkPHP 3 的CURD介绍 (了解) 二.ThinkPHP 3 读取数据 (重点) 对数据的读取 Read $m=new Model('User'); $m=M('User ...

  6. 《windows程序设计》学习_3.3:利用xp扫雷资源

    #include<windows.h> #include "resource.h" LRESULT CALLBACK WndProc (HWND, UINT, WPAR ...

  7. poj 1815 Friendship (最小割+拆点+枚举)

    题意: 就在一个给定的无向图中至少应该去掉几个顶点才干使得s和t不联通. 算法: 假设s和t直接相连输出no answer. 把每一个点拆成两个点v和v'',这两个点之间连一条权值为1的边(残余容量) ...

  8. getline函数

    在我的印象中,getline函数常常出如今自己的视野里,模糊地记得它常常常使用来读取字符串 .可是又对它的參数不是非常了解,今天又用到了getline函数,如今来细细地总结一下: 首先要明确设计get ...

  9. [poj 3159]Candies[差分约束详解][朴素的考虑法]

    题意 编号为 1..N 的人, 每人有一个数; 需要满足 dj - di <= c 求1号的数与N号的数的最大差值.(略坑: 1 一定要比 N 大的...difference...不是" ...

  10. 在unity 脚本中获取客户端的IP地址

    需要using System.Net.NetworkInformation;原理就是获取网卡的信息. //下面这段代码是我在百度贴吧找来的,经检验是正确的 string userIp = " ...