题目链接: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 ...
随机推荐
-
Android高效加载大图、多图解决方案,有效避免程序OOM
高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是 ...
-
hdu 2586 How far away ?(离线求最近公共祖先)
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #i ...
-
Android Fragment基础及使用
同一个app内的界面切换 用Fragment比较合适,因为Activity比较重量级 Fragment 轻量级,切换灵活 --------------------------------------- ...
-
【动态规划】HDU 1081 &; XMU 1031 To the Max
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1081 http://acm.xmu.edu.cn/JudgeOnline/problem.php?i ...
-
c#1所搭建的核心基础之类型系统的特征
类型系统的特征简介 几乎每种编程语言都有某种形式的一个类型系统.类型系统大致被分为:强/弱,安全/不安全,静态/动态,显式/隐式等类型. c#在类型系统世界中的位置 c#1的类型系统是静态的.显式的和 ...
-
AMQP协议学习
参考这个:http://kb.cnblogs.com/page/73759/ 写的挺好 AMQP协议是一种二进制协议,提供客户端应用与消息中间件之间异步.安全.高效地交互.从整体来看,AMQP协议可划 ...
-
Ajax笔记 XHR XMLHttpRequest
XMLHttpRequest xhr XmlHttpRequest var request ; if(Windows.XMLHttpRequest) { request ...
-
Java-Runoob-高级教程-实例-方法:08. Java 实例 – break 关键字用法
ylbtech-Java-Runoob-高级教程-实例-方法:08. Java 实例 – break 关键字用法 1.返回顶部 1. Java 实例 - break 关键字用法 Java 实例 Ja ...
-
log4j最中意的配置
log4j.rootLogger=DEBUG, Console, logfile log4j.appender.Console=org.apache.log4j.ConsoleAppender log ...
-
【转】如何向XML内插入一个字符串片段
转自:http://bbs.csdn.net/topics/190051229 5楼 string filepath = Server.MapPath("你的xml文件"); ...