HDU:1757 A Simple Math Problem
来源:互联网 发布:淘宝学生家代购 编辑:程序博客网 时间:2024/06/06 00:18
A Simple Math Problem
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4788 Accepted Submission(s): 2876
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.
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.
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 99991 1 1 1 1 1 1 1 1 120 5001 0 1 0 1 0 1 0 1 0
Sample Output
45104
解题思路:
矩阵快速幂题目。
线性代数没白学,好有用,不过这个题目推出矩阵是难点。
别人的图:画的真好,一目了然。
#include<iostream>#include<stdio.h>#include<string.h>using namespace std;const int maxn = 11;int mod; ///模struct Matrix{ int m[maxn][maxn];}ans,res;///矩阵乘法,计算矩阵a*b。Matrix Mul(Matrix a,Matrix b){ Matrix tmp; memset(tmp.m,0,sizeof(tmp.m)); for(int i = 1; i <= 10; i++) for(int j = 1; j <= 10; j++) for(int k = 1; k <= 10; k++) tmp.m[i][j] = (tmp.m[i][j]+a.m[i][k]*b.m[k][j])%mod; return tmp;}void QuickPower(int N){ ///ans初始为单位矩阵,任何矩阵乘上单位阵都是其本身 memset(ans.m,0,sizeof(ans.m)); for(int i = 1; i <= 10; i++) ans.m[i][i] = 1; while(N) { if(N&1) ans = Mul(ans,res); res = Mul(res,res); N >>= 1; }}int main(){ int k; while(~scanf("%d%d",&k,&mod)) { memset(res.m,0,sizeof(res.m)); ///输入a[0]到a[9] for(int i = 1; i <= 10; i++) { scanf("%d",&res.m[1][i]); res.m[1][i] = res.m[1][i]%mod; } for(int i = 2; i <= 10; i++) res.m[i][i-1] = 1; if(k < 10) printf("%d\n",k); else { k = k-9; QuickPower(k); ///矩阵快速幂 int a = 0; for(int i = 1; i <= 10; i++) { a += ans.m[1][i]*(10-i); a = a%mod; } printf("%d\n",a); } } return 0;}
阅读全文
0 0
- HDU 1757 A Simple Math Problem
- HDU 1757 A Simple Math Problem
- hdu 1757 A Simple Math Problem
- Hdu 1757 A Simple Math Problem
- A Simple Math Problem hdu 1757
- HDU-1757A Simple Math Problem
- HDU 1757 A Simple Math Problem
- hdu 1757:A Simple Math Problem
- hdu 1757 A Simple Math Problem
- hdu 1757 A Simple Math Problem
- hdu 1757 A Simple Math Problem 矩阵
- hdu 1757 A Simple Math Problem
- hdu 1757 A Simple Math Problem 矩阵
- HDU 1757 A Simple Math Problem
- 【HDU 1757 A Simple Math Problem】+ 矩阵
- HDU 1757 A Simple Math Problem
- HDU 1757A Simple Math Problem
- HDU:1757 A Simple Math Problem
- 用数组实现简易的学生管理系统-1
- Java虚拟机(四)垃圾收集算法
- C++_008_数据结构_线性表_普通线性表
- 大数据架构和模式(二)如何知道一个大数据解决方案是否适合您的组织
- Codeforces Beta Round #2 A. Winner
- HDU:1757 A Simple Math Problem
- Leetcode: max-points-on-a-line
- 人事面试一百问
- Linux下启动、停止xampp命令
- CUDA学习教程
- 数据挖掘基础入门实验
- malloc calloc realloc free的简单实现
- 阶层位数
- 2017 WUST校赛 1009 LL&a+b-c