hdu 1757 (矩阵快速幂) 一个简单的问题 一个简单的开始
题目链接: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 (矩阵快速幂) 一个简单的问题 一个简单的开始的更多相关文章
- hdu 1757 矩阵快速幂 **
一看正确率这么高,以为是水题可以爽一发,结果是没怎么用过的矩阵快速幂,233 题解链接:点我 #include<iostream> #include<cstring> ; us ...
- 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 ...
- HDU 4471 矩阵快速幂 Homework
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 解题思路,矩阵快速幂····特殊点特殊处理····· 令h为计算某个数最多须知前h个数,于是写 ...
- HDU - 1575——矩阵快速幂问题
HDU - 1575 题目: A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n( ...
- 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} ...
- HDU 2855 (矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 题目大意:求$S(n)=\sum_{k=0}^{n}C_{n}^{k}Fibonacci(k)$ ...
- HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂
装载自:http://www.cnblogs.com/183zyz/archive/2012/05/11/2495401.html 题目让求一个函数调用了多少次.公式比较好推.f[n] = f[n-1 ...
- 随手练——HDU 5015 矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5015 看到这个限时,我就知道这题不简单~~矩阵快速幂,找递推关系 我们假设第一列为: 23 a1 a2 ...
- hdu 1597(矩阵快速幂)
1597: 薛XX后代的IQ Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 228 Solved: 55[Submit][Status][Web Bo ...
随机推荐
- 学习JS的心路历程-类型
前言 之前学JS时候都是靠着谷狗一路跌跌撞撞的学过来,从来没有去翻过MDN的文件,导致留了许多技术债给自己. 最近有幸遇到一位前辈并开始从头学JS,前辈表示学程序不看文件是想作死自己?于是我的第一份功 ...
- php首字母 大写 数组去重复
$zimu[]=strtoupper(substr( $value['title'], 0, 1 ));//大写 $zimu[]=strtolower(substr( $value['title'], ...
- url中传递中文参数时的转码与解码
URL传递中文参数时的几种处理方式,总结如下: 1.将字符串转码:newString(“xxxxx”.getBytes("iso-8859-1"),"utf-8" ...
- session of express
[session of express] 1.express-session 一个提供session功能库 npm install express-session --save var session ...
- 搭建ssm环境
在eclipse下搭建ssm框架. 1.新建maven项目. 2.添加jar包依赖 3.修改web.xml配置文件 <?xml version="1.0" encoding= ...
- python 常用模块(一): random , time , sys , os模块部分知识.
1.常用模块:(1)collectiaons模块 (2)与时间相关 time模块 (3)random模块 (4)os模块 (5)sys模块 (6) 序列化模块: json , pickle 2 ...
- day13 多个装饰器叠加 生成式
1.装饰器剩余 from functions import wraps @wrap(func) 会把func内的自带方法赋给wrapper,这样wrapper装饰函数就和原函数一模一样 多个装饰器叠加 ...
- Numpy:ndarray数据类型和运算
Numpy的ndarray:一种多维数组对象 N维数组对象,该对象是一个快速而灵活的大数据集容器,nadarry是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的.每个数组都有一个 ...
- Struts学习资料
Strust组件—ActionServlet详解 http://ltc603.iteye.com/blog/68637
- Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)
在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降.那么怎么才能找出这些埋在程序里 ...