A Simple Math Problem (谢庆皇)
来源:互联网 发布:米洛舍维奇 知乎 编辑:程序博客网 时间:2024/06/05 05:16
/*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
*/
/* A Simple Math Problem
Time limit: 1000MS Memory limit: 32768K
Total Submit: 5 Accepted: 4
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*109 , m < 104 )
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
解题的关键在于如何构建矩阵
#include <stdio.h>#include <string.h>#include <stdlib.h>#define le 11typedef struct{ int map[le][le];}re;re init,unit,ar;int k,m;void initdata()//*********************初始化矩阵**********{ int i,j; for(i = 0;i < 10;i++) for(j = 0;j < 10;j++){ if(i==j+1) init.map[i][j] = 1; //init 矩阵i==j+1时为* 1 *,其余为** 0 **;(后面再输入第一行的值) else init.map[i][j] = 0; if(i == j) unit.map[i][j] = 1; //unit 矩阵对角线为** 1 **其余都为** 0 ** else unit.map[i][j] = 0; ar.map[i][j] = 0; } for(i = 9;i >= 0;i--) ar.map[9-i][0] = i; //ar 矩阵赋值为i(因为k《=9时等于自身)}//*********************************re mul(re va,re vb)//**********************************{ int i,j,k; re c; //re c; for(i = 0;i < 10;i++) for(j = 0;j < 10;j++){ c.map[i][j] = 0; for(k = 0;k < 10;k++) c.map[i][j] += va.map[i][k] * vb.map[k][j]; c.map[i][j] %= m; } return c;}//*************************************************************int cal()//*******************************************************{ int i=k-9; //k>=10的时候***** re p = unit,q = init,c; //定义p=unit(1),q=init(输入的_),还有一个新的c while(i>1){ if(i%2){ p = mul(p,q); i--; } else { q = mul(q,q); i/=2; } } c = mul(p,q); c = mul(c,ar); //最后再乘以(9,8,7,6,5,4,3,2,1) return c.map[0][0];}//***********************************************************int main(){ initdata();int i,ans; while(scanf("%d%d",&k,&m)==2){for(i=0;i<10;i++)scanf("%d",&init.map[0][i]);//输入第一行矩阵的值**initif(k <= 9){printf("%d\n",k%m);continue;}ans = cal(); //cal 处理函数**********printf("%d\n",ans); } return 0;}
- A Simple Math Problem (谢庆皇)
- A Simple Math Problem
- A Simple Math Problem
- A Simple Math Problem
- A Simple Math Problem
- A Simple Math Problem
- A simple math problem
- A Simple Math Problem
- (HDU 1757)A Simple Math Problem
- A Simple Math Problem hdu1757
- hdu A Simple Math Problem
- hdu1757 A Simple Math Problem
- HDU1757 A Simple Math Problem
- hdu4979 A simple math problem.
- HDU4979 A simple math problem.
- HDU1757 A Simple Math Problem
- hdu1757 - A Simple Math Problem
- A Simple Math Problem HDU1757
- cannot open clipboard 解决办法
- Silverlight WCF RIA服务(二十八)Silverlight 客户端 9
- 绑定下拉框
- 文件上传的原理
- jquery在eclipse工程中错误显示的解决
- A Simple Math Problem (谢庆皇)
- Silverlight WCF RIA服务(二十九)Silverlight 客户端 10
- 写给职场新人的话:跟优秀的人学习
- 敏捷开发“松结对编程”实践之三:共同估算篇(大型研发团队,学习型团队,139团队,师徒制度,敏捷设计,估算扑克,扑克牌估算) .
- 单链表的建立,测长,打印,删除,插入,排序,逆置
- Silverlight WCF RIA服务(三十)身份验证、角色、个性化 1
- 广州传智播客首个.net训练营欢乐开班——精英汇聚
- HDU-1258-Sum It Up
- C#中定时器的使用方法