博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1757 A Simple Math Problem (矩阵乘法)
阅读量:5998 次
发布时间:2019-06-20

本文共 2225 字,大约阅读时间需要 7 分钟。

A Simple Math Problem

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1697    Accepted Submission(s): 959

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
 

 

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);
|f(10) |       |a0 a1 a2 ...a8 a9|    |f(9)|
| f(9)  |       | 1   0   0 ... 0    0 |    |f(8)|
| .....  |   =  | ..    ...    ...   ...    |    | .. |
| f(2) |        | 0   0   0 ... 0    0|     |f(1)|
| f(1) |   | 0   0   0 ... 1    0|     |f(0)|
另A举证为10*10的举证,如上图。
可以推出:
(f(n),f(n-1),...,f(n-9))^(-1) = A^(n-9)*(f(9),f(8),...,f(0))^(-1)

 

#include
#include
#include
using namespace std;long long k,mod;struct Matrix{ int m[15][15];};Matrix unit,init;void Init(){ memset(init.m,0,sizeof(init.m)); for(int i=1;i<10;i++) init.m[i][i-1]=1; memset(unit.m,0,sizeof(unit.m)); for(int i=0;i<10;i++) unit.m[i][i]=1;}Matrix Mul(Matrix a,Matrix b){ Matrix c; for(int i=0;i<10;i++) for(int j=0;j<10;j++){ c.m[i][j]=0; for(int k=0;k<10;k++) c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mod; c.m[i][j]%=mod; } return c;}Matrix Pow(Matrix a,Matrix b,int x){ while(x){ if(x&1){ b=Mul(a,b); } a=Mul(a,a); x>>=1; } return b;}int main(){ //freopen("input.txt","r",stdin); while(cin>>k>>mod){ Init(); for(int i=0;i<10;i++) scanf("%d",&init.m[0][i]); if(k<10){ cout<
<

 

转载地址:http://yfzmx.baihongyu.com/

你可能感兴趣的文章
Quartz集成springMVC 的方案二(持久化任务、集群和分布式)
查看>>
Android常用工具类
查看>>
《感冒+发烧》后的感受
查看>>
Shell 文件包含
查看>>
用PLSQL Developer 查看连接因子 tnsnames.ora
查看>>
pytest文档17-fixture之autouse=True
查看>>
for循环里使用查询如何优化(代码库)
查看>>
深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 3
查看>>
Webalizer web服务器日志分析程序
查看>>
[Cocoa]深入浅出Cocoa之Core Data(3)- 使用绑定
查看>>
asp.net获取存储过程的输出参数
查看>>
C++中的new
查看>>
北京仅项目发生sql_partition、minus
查看>>
C# 使用SqlBulkCopy类批量复制大数据
查看>>
LoadRunner 技巧之协议分析
查看>>
sublime text 3 3017 系统默认快捷键定义文件Default (Windows).sublime-keymap
查看>>
设计模式(六)—原型模式Prototype(创建型)
查看>>
Linux基本操作 2-----Linux文件系统基本结构
查看>>
【转】編譯Ogre1.9 IOS Dependencies及Ogre Source步驟及相關注意事項…
查看>>
Assembly类
查看>>