HDU 5015 233 Matrix
2015-09-17 18:47
375 查看
233 Matrix
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1515 Accepted Submission(s): 890
Problem Description
In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233333 ... in the same meaning. And here is the question: Suppose we have a matrix called 233 matrix. In the first line, it would be 233, 2333, 23333... (it means
a0,1 = 233,a0,2 = 2333,a0,3 = 23333...) Besides, in 233 matrix, we got ai,j = ai-1,j +ai,j-1( i,j ≠ 0). Now you have known a1,0,a2,0,...,an,0, could you tell
me an,m in the 233 matrix?
Input
There are multiple test cases. Please process till EOF.
For each case, the first line contains two postive integers n,m(n ≤ 10,m ≤ 109). The second line contains n integers, a1,0,a2,0,...,an,0(0 ≤ ai,0 < 231).
Output
For each case, output an,m mod 10000007.
Sample Input
1 1
1
2 2
0 0
3 7
23 47 16
Sample Output
234
2799
72937
Hint
Source
2014 ACM/ICPC Asia Regional Xi'an Online
#include <cstdio>
#include <cstring>
typedef long long LL;
const LL MOD = 10000007;
const int N = 13;
struct matrix{
LL ary
;
void init() {
memset(ary, 0, sizeof(ary));
}
matrix() {
init();
}
};
const matrix operator*(const matrix & A, const matrix & B) {
matrix t;
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j) {
for (int k = 0; k < N; ++k)
t.ary[i][j] += A.ary[i][k] * B.ary[k][j];
t.ary[i][j] = (t.ary[i][j] + MOD) % MOD;
}
return t;
}
LL quick_pow(LL n, LL k) {
matrix ans, tmp;
tmp.ary[0][0] = 10;
tmp.ary[0][n + 1] = tmp.ary[n + 1][n + 1] = 1;
ans.ary[0][0] = 23;
ans.ary[n + 1][0] = 3;
for (int i = 1; i <= n; ++i) {
scanf("%lld", &ans.ary[i][0]);
tmp.ary[i][0] = 10;
tmp.ary[i][n + 1] = 1;
for (int j = 1; j <= i; ++j)
tmp.ary[i][j] = 1;
}
while (k) {
if (k & 1)
ans = tmp * ans;
k >>= 1;
tmp = tmp * tmp;
}
return ans.ary
[0];
}
int main() {
LL n, m;
while (~scanf("%lld%lld", &n, &m))
printf("%lld\n", quick_pow(n, m));
return 0;
}
相关文章推荐
- 黑马程序员 java 设计模式之 工厂方法
- 深入理解Java的接口和抽象类
- FMDB实战
- html5实现微信摇一摇功能
- protobuf相关的操作函数
- ORACLE触发器详解
- Hadoop中HDFS的设计目标
- Java学习笔记04 异常
- 深入理解Android的startservice和bindservice
- IOS每天15个注意点系列之UI-应用管理
- 黑马程序员 深入理解 Java中的 流 (Stream)
- Codeforces Round #320 (Div. 2)D. "Or" Game
- 关于SOCKET 接收发送 缓冲区 测试 SO_SNDBUF
- Activity总结
- 函数后面加const
- 蘑菇街2015校招技术类笔试题A卷,回忆版(杭州站)
- Android中GridView使用
- Cocos2d-x从入门到精通第17课《变速动作》
- Linux信号编程实践(二) 信号发送函数和可重入函数
- 日记 - aop