题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757

题意不难理解,当x小于10的时候,数列f(x)=x,当x大于等于10的时候f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);

所求的是f(x)取m的模,而x,m,a[0]至a[9]都是输入项

初拿到这道题,最开始想的一般是暴力枚举,通过for循环求出f(x)然后再取模,但是有两个问题,首先f(x)可能特别大,其次是枚举超时。

所以,想到可以用到通过构造矩阵快速幂的方法。

稍微有点线性代数基础的人(比如本人)都知道可以构造一个10*10的矩阵

(10有点大,这里以3*3的代替,题意还是不变)

0  0  a0                                                0  0  a0    0  0  a0

(f0,f1,f2)*   1  0  a1 --->(f1,f2,f3)     然后(f0,f1,f2)* 1  0  a1 * 1  0  a1 --->(f2,f3,f4)

0  1  a2                                                0  1  a2    0  1  a2

0  0  a0   0  0  a0

最后一直到f(x)   (f0,f1,f2)* 1  0  a1* 1  0  a1*******--->(fx-2,fx-1,fx)

0  1  a2   0  1  a2

10*10的矩阵也基本很这个一样,然后光有矩阵并没有太大的卵用,还得用快速幂来取模,只不过换成了矩阵而已。

先开两个二维数组把矩阵给存起来(对,开两个存一模一样的矩阵,如果一下子没有反应过来为什么的等你写到这里的时候就知道为什么了)

然后第三个数组存相乘过程中的结果。(如果快速幂不会的请百度)

最后的用已知的f(i)数组的前十项分别乘以最终矩阵的最后一列的和就是最终结果

(PS:加减乘法的取模可以分步,而除法不行)

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long jz1[][],jz2[][],jz3[][],i,j,k;
long long a[],m;
long long lsy(long long n)
{
long long sum=;
for (i=;i<=;i++){ //创建矩阵
for (j=;j<=;j++){
if (j!=){
if (i-j==)
{
jz1[i][j]=;
jz2[i][j]=;
}
else
{
jz1[i][j]=;
jz2[i][j]=;
}
}
else
{
jz1[i][]=a[-i];
jz2[i][]=a[-i];
}
}
}
n-=;
while (n!=) //快速幂取模
{
if (n&)
{
memset(jz3,,sizeof(jz3));
for (i=;i<=;i++){
for (j=;j<=;j++){
for (k=;k<=;k++){
jz3[i][j]+=jz1[i][k]*jz2[k][j]%m;
}
}
}
memcpy(jz2,jz3,sizeof(jz3));
}
memset(jz3,,sizeof(jz3));
for (i=;i<=;i++){
for (j=;j<=;j++){
for (k=;k<=;k++){
jz3[i][j]+=jz1[i][k]*jz1[k][j]%m;
}
}
}
memcpy(jz1,jz3,sizeof(jz3));
n>>=; //不要忘了
}
for (i=;i<;i++) //求出f(x)
sum=(((i%m)*jz2[i][])%m+sum)%m;
return sum;
}
int main()
{
long long n;
while (~scanf("%I64d %I64d",&n,&m))
{
if (n==&&m==) break;
for (i=;i<=;i++)
scanf("%l64d",&a[i]);
if (n>=)
printf("%I64d\n",lsy(n));
else
printf("%I64d\n",n%m);
}
return ;
}

hdu 1757 (矩阵快速幂) 一个简单的问题 一个简单的开始的更多相关文章

  1. hdu 1757 矩阵快速幂 **

    一看正确率这么高,以为是水题可以爽一发,结果是没怎么用过的矩阵快速幂,233 题解链接:点我 #include<iostream> #include<cstring> ; us ...

  2. HDU 1757 矩阵快速幂加速递推

    题意: 已知: 当x<10时:f(x)=x 否则:f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + --+ a9 * f(x-10); 求:f(x ...

  3. HDU 4471 矩阵快速幂 Homework

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 解题思路,矩阵快速幂····特殊点特殊处理····· 令h为计算某个数最多须知前h个数,于是写 ...

  4. HDU - 1575——矩阵快速幂问题

    HDU - 1575 题目: A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973.  Input数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n( ...

  5. HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识

    求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...

  6. HDU 2855 (矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 题目大意:求$S(n)=\sum_{k=0}^{n}C_{n}^{k}Fibonacci(k)$ ...

  7. HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂

    装载自:http://www.cnblogs.com/183zyz/archive/2012/05/11/2495401.html 题目让求一个函数调用了多少次.公式比较好推.f[n] = f[n-1 ...

  8. 随手练——HDU 5015 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5015 看到这个限时,我就知道这题不简单~~矩阵快速幂,找递推关系 我们假设第一列为: 23 a1 a2 ...

  9. hdu 1597(矩阵快速幂)

    1597: 薛XX后代的IQ Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 228  Solved: 55[Submit][Status][Web Bo ...

随机推荐

  1. 在iOS上使用ffmpeg播放视频

    国外靠谱的有这几个:1.Mooncatventures group https://github.com/mooncatventures-group 2.KxMoviePlayer (use Open ...

  2. EF 1

    安装框架: 在NuGet中安装ef框架,命令:Install-package EntityFramework 数据迁移: 在程序包管理器控制台,执行语句. 初始化: 1.Enable-Migratio ...

  3. 指向字符串的指针和char类型的数组

    指针数组的效率比二维字符数组的效率高 指针数组不能修改字符串字面量,而二维字符数组中的内容可以更改

  4. vue如果是首页了 不让其后退

    history.pushState(null, null, document.URL); //首页加载时候先置空 window.addEventListener('popstate', functio ...

  5. SAP 优缺点

    1.优点: SAP是全球所有ERP产品中对企业构架和财务控制考虑得最细致的系统,也是整体控制逻辑和整体系统结构是最严谨的系统,可以让企业引进先进的管理理念: 对产品在各种行业的适用性考虑得最多的系统, ...

  6. apache常见的一些配置

    <VirtualHost *:80>ServerName www.aliyun.com #域名ServerAlias www.aliyun.com #别名DocumentRoot /dat ...

  7. yum except KeyboardInterrupt, e: 错误

    在上一篇升级python的时候的,使用yum时,出现以下错误   [root@localhost bin]# yum   File "/usr/bin/yum", line 30 ...

  8. python网络编程之C/S架构介绍

    标签(空格分隔): c/s架构介绍 什么是C/S架构 C指的是client(客户端软件),S指的是Server(服务端软件),后续我们可以试着写个c/s软件实现服务器软件与客户端软件基于网络通信: 计 ...

  9. iframe解决ajax主域和子域之间的跨域问题

    在某些应用场景下,需要在主域中,调用子域中的某个接口,如果直接在主域中向子域发ajax请求,会报跨域错误,可以用iframe来解决这种跨域问题.假如主域为www.baidu.com,子域为baike. ...

  10. Java String和StringBuffer和StringBuilder

    最近在牛课网上做了几道字符串操作的题目,好久没有做题了,之前用的也是大一时C语言做的,对Java字符串操作不太了解,所以深入了解一下String类的相关用法 String构造方法 String() 空 ...