hdu 1757 A Simple Math Problem (乘法矩阵)

时间:2023-02-08 13:47:28

A Simple Math Problem

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2441    Accepted Submission(s): 1415

Problem Description
Lele now is thinking about a simple function f(x).

If x < 10 f(x) = x.
If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);
And ai(0<=i<=9) can only be 0 or 1 .

Now, I will give a0 ~ a9 and two positive integers k and m ,and could you help Lele to caculate f(k)%m.

 
Input
The problem contains mutiple test cases.Please process to the end of file.
In each case, there will be two lines.
In the first line , there are two positive integers k and m. ( k<2*10^9 , m < 10^5 )
In the second line , there are ten integers represent a0 ~ a9.
 
Output
For each case, output f(k) % m in one line.
 
Sample Input
10 9999
1 1 1 1 1 1 1 1 1 1
20 500
1 0 1 0 1 0 1 0 1 0
 
Sample Output
45
104
 
Author
linle
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  1588 3117 2276 2256 2254 
 

开始没什么思路,后来还是没思路..

然后看解题报告,发现时乘法矩阵,关键点还是在构造矩阵上。

参考:http://blog.sina.com.cn/s/blog_79b832820100wnu3.html

f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10)

构造的矩阵是:

|0 1 0 ........... 0|    |f0|    |f1 |
|0 0 1 0 ........ 0|    |f1|    |f2 |
|.....................1| * |...| = |...|
|a9 a8 .........a0 |    |f9|    |f10|

设为矩阵 A * 矩阵B =矩阵C

我们要求的是 f(k),就是矩阵C的最后一个元素,故依据矩阵的结合律,可看到

C=A*(A*(.....*(A*B))) ,要有k个A即 C=A^k*B ,然后就可以二分求A^k,最后乘上B就可以求得矩阵C

 //0MS    232K    1214 B    C++
#include<stdio.h>
#include<string.h>
#define N 15
struct matrix{
int g[N][N];
}ans,temp;
int g[N];
int m;
matrix mul(matrix a,matrix b)
{
matrix c;
for(int i=;i<;i++)
for(int j=;j<;j++){
c.g[i][j]=;
for(int k=;k<;k++)
c.g[i][j]+=a.g[i][k]*b.g[k][j];
c.g[i][j]%=m;
}
return c;
}
void solve(int k)
{
while(k){
if(k&) ans=mul(temp,ans);
temp=mul(temp,temp);
k/=;
}
int sum=;
/*
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
printf(j==9?"%d\n":"%d ",ans.g[i][j]);
*/
for(int i=;i<;i++){
sum+=ans.g[][i]*i;
sum%=m;
}
printf("%d\n",sum);
}
int main(void)
{
int k;
while(scanf("%d%d",&k,&m)!=EOF)
{
for(int i=;i<;i++)
for(int j=;j<;j++)
temp.g[i][j]=ans.g[i][j]=;
for(int i=;i<;i++)
scanf("%d",&g[i]);
for(int i=;i<;i++){
if(i<) temp.g[i][i+]=;
ans.g[i][i]=;
temp.g[][i]=g[-i];
}
solve(k-);
}
return ;
}

hdu 1757 A Simple Math Problem (乘法矩阵)的更多相关文章

  1. HDU 1757 A Simple Math Problem 【矩阵经典7 构造矩阵递推式】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1757 A Simple Math Problem Time Limit: 3000/1000 MS (J ...

  2. HDU 1757 A Simple Math Problem (矩阵乘法)

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  3. HDU 1757 A Simple Math Problem(矩阵高速幂)

    题目地址:HDU 1757 最终会构造矩阵了.事实上也不难,仅仅怪自己笨..= =! f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 ...

  4. HDU 1757 A Simple Math Problem(矩阵快速幂)

    题目链接 题意 :给你m和k, 让你求f(k)%m.如果k<10,f(k) = k,否则 f(k) = a0 * f(k-1) + a1 * f(k-2) + a2 * f(k-3) + …… ...

  5. hdu 1757 A Simple Math Problem(矩阵快速幂乘法)

    Problem Description Lele now is thinking about a simple function f(x). If x < f(x) = x. If x > ...

  6. hdu 1757 A Simple Math Problem (矩阵快速幂)

    Description Lele now is thinking about a simple function f(x). If x < 10 f(x) = x. If x >= 10 ...

  7. hdu 1757 A Simple Math Problem (矩阵快速幂,简单)

    题目 也是和LightOJ 1096 和LightOJ 1065 差不多的简单题目. #include<stdio.h> #include<string.h> #include ...

  8. hdu 1757 A Simple Math Problem &lpar;构造矩阵解决递推式问题&rpar;

    题意:有一个递推式f(x) 当 x < 10    f(x) = x.当 x >= 10  f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + ...

  9. hdu 1757 A Simple Math Problem (矩阵高速幂)

    和这一题构造的矩阵的方法同样. 须要注意的是.题目中a0~a9 与矩阵相乘的顺序. #include <iostream> #include <cstdio> #include ...

随机推荐

  1. 实用的Portraiture滤镜磨皮教程

    滤镜可以快速地进行人物皮肤美化处理,Portraiture滤镜可以将皮肤柔化,消除多余的斑点,在磨皮后复制细节保留较多的通道到图层面板,用高反差保留滤镜提取细节,再更改图层混合模式即可以得到漂亮的肤色 ...

  2. Oracle instr函数与SqlServer charindex的区别

    INSTR(C1,C2[,I[,J]]) [功能]在一个字符串中搜索指定的字符,返回发现指定的字符的位置; [说明]多字节符(汉字.全角符等),按1个字符计算 [参数] C1 被搜索的字符串      ...

  3. jQuery&period;outerWidth&lpar;&rpar; 函数详解

    outerWidth()函数用于设置或返回当前匹配元素的外宽度. 外宽度默认包括元素的内边距(padding).边框(border),但不包括外边距(margin)部分的宽度.你也可以指定参数为tru ...

  4. 8051学习笔记——IIC与EEPROM实验

    main.c #include <reg51.h> #include "iic.h" #define AT24C02 0xa0 //AT24C02 地址 sbit LS ...

  5. MQ&lpar;消息队列&rpar;常见的应用场景解析

    前言 提高系统性能首先考虑的是数据库的优化,之前一篇文章<数据库的使用你可能忽略了这些>中有提到过开发中,针对数据库需要注意的事项.但是数据库因为历史原因,横向扩展是一件非常复杂的工程,所 ...

  6. Nginx Java 日志切割脚本

    Nginx日志切割脚本: #!/bin/bash ########################################################################### ...

  7. 台式电脑、笔记本快捷选择启动项Boot 快捷键大全

    我们在安装系统时,会去设置电脑是从硬盘启动.U盘启动.光驱启动.网卡启动. 一般设置的方法有两种:一种是进BIOS主板菜单设置启动项顺序:另一种就是我在这里要介绍的快捷选择启动项. 以下是网友整理的各 ...

  8. webpack优化记录

    什么是Webpack  .  ( 模块打包机,分析项目结构,找到js不能识别的代码语言,转换和打包后,供browser使用 ) WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到 ...

  9. Hive安装 和管理

  10. 028、HTML 标签1列表、图片、表格

    内容简单看一下理解就行了. HTML 是用来描述网页的一种语言.就是用来编写网页的语言 内容:换行.分割,标签属性,编码方式设置,字体标签,特殊符号,列表.图片.表格标签############### ...