题目链接: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. 升级tensorflow1.0到1.3,报错ImportError: libcudnn.so.6: cannot open shared object file: No such file or directory Failed to load the native TensorFlow runtime.

    先定位问题,发现在 /usr/local/cuda/include/ /usr/local/cuda/lib64/ 下面只有 libcudnn.so.5 因此,只要下载cudnn6.*版本的文件分别覆 ...

  2. workerman 平滑重启

    <?phpuse Workerman\Worker;use Workerman\Lib\Timer; require_once '../../web/Workerman/Autoloader.p ...

  3. 大型运输行业实战_day12_1_权限管理实现

    1.业务分析 权限说的是不同的用户对同一个系统有不同访问权限,其设计的本质是:给先给用户分配好URL,然后在访问的时候判断该用户是否有当前访问的URL. 2.实现 2.1数据库设计标准5表权限结构 2 ...

  4. centos6安装自带php

    一.Centos 6安装自带PHP CentOS 默认仓库中包含了php套件,我们可以直接使用yum安装.下面是最小化安装,我们使用php-fpm来解析php. yum install -y php- ...

  5. java分解质因数,具体程序分析和代码

    题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 将一个正整数分解质因数分析:对n进行分解质因数,找到最小的质数k如果这个质数恰好等于n则说明分解质因数过程已经结束,打印输出 ...

  6. js中基本事件的总结,onclick、onblur、onchange等

    js中的基本事件总结: 特定的场景下发生的一个动作:事件:事件=函数(),事件发生会触发函数执行. 属性 当以下情况发生时,出现此事件 FF N IE onabort 图像加载被中断 1 3 4 on ...

  7. appium+python自动化测试

    appium+python自动化测试 标签(空格分隔): appium 获取APP的包名 1.aapt即Android Asset Packaging Tool,在SDK的build-tools目录下 ...

  8. NBU 还原LINUX ORACLE 数据库(EHR)

    一.E-HR数据库(全备)恢复 目录 一.E-HR数据库(全备)恢复... 1 1. 使用bplist 命令读取备份文件... 1 2. 启动到nomount状态... 2 3. 利用rman还原控制 ...

  9. Jmeter:性能测试指南(转)

    http://yukinami.github.io/2015/11/26/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E6%8C%87%E5%8D%97/ 性能测试指南 ...

  10. 安卓GreenDao框架一些进阶用法整理(转)

    大致分为以下几个方面: 一些查询指令整理 使用SQL语句进行特殊查询 检测表字段是否存在 数据库升级 数据库表字段赋初始值 一.查询指令整理 1.链式执行的指令 return mDaoSession. ...