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 a 0,1 = 233,a 0,2 = 2333,a 0,3 = 23333...) Besides, in 233 matrix, we got a i,j = a i-1,j +a i,j-1( i,j ≠ 0). Now you have known a 1,0,a 2,0,...,a n,0, could you tell me a n,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 ≤ 10 9). The second line contains n integers, a 1,0,a 2,0,...,a n,0(0 ≤ a i,0 < 2 31).

 

Output

For each case, output a n,m mod 10000007.
 

Sample Input

1 1
1
2 2
0 0
3 7
23 47 16
 

Sample Output

234
2799
72937

Hint

这个题目由于m数据范围很大,故不能直接暴力计算。此处采用矩阵乘法,由矩阵乘法可以由每一列得到下一列。然后矩阵的乘法使用快速幂加快计算。

由2333可以由233乘10加3,于是打算构造n+2行的方阵。

大致如下:

10 0 0 0 ……0 1

10 1 0 0 ……0 1

10 1 1 0 ……0 1

……

10 1 1 1 ……1 1

0   0 0 0 ……0 1

而所要求的列矩阵大致如下:

23……3

a 1,0

a 2,0

……

a n,0

3

递推的正确性可以通过计算验证

此处矩阵通过结构体,运算符重载完成。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <string>
#define inf 0x3fffffff
#define esp 1e-10
#define N 10000007
#define LL long long using namespace std; struct Mat
{
LL val[15][15];
int len; Mat operator = (const Mat& a)
{
for (int i = 0; i < len; ++i)
for (int j = 0; j < len; ++j)
val[i][j] = a.val[i][j];
len = a.len;
return *this;
} Mat operator * (const Mat& a)
{
Mat x;
memset(x.val, 0, sizeof(x.val));
x.len = len;
for (int i = 0; i < len; ++i)
for (int j = 0; j < len; ++j)
for (int k = 0; k < len; ++k)
if (val[i][k] && a.val[k][j])
x.val[i][j] = (x.val[i][j] + (val[i][k]*a.val[k][j])%N)%N;
return x;
} Mat operator ^ (const int& a)
{
int n = a;
Mat x, p = *this;
memset(x.val, 0, sizeof(x.val));
x.len = len;
for (int i = 0; i < len; ++i)
x.val[i][i] = 1;
while (n)
{
if (n & 1)
x = x * p;
p = p * p;
n >>= 1;
}
return x;
}
}; int n, m;
LL a[15], ans; void Make(Mat &p)
{
p.len = n + 2;
memset(p.val, 0, sizeof(p.val));
for (int i = 0; i <= n; ++i)
p.val[i][0] = 10;
for (int i = 0; i <= n+1; ++i)
p.val[i][n+1] = 1;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= i; ++j)
p.val[i][j] = 1;
} int main()
{
//freopen("test.txt", "r", stdin);
while (scanf("%d%d", &n, &m) != EOF)
{
Mat p;
Make(p);
p = p ^ m;
a[0] = 23;
a[n+1] = 3;
for (int i = 1; i <= n; ++i)
scanf("%I64d", &a[i]);
ans = 0;
for (int i = 0; i <= n+1; ++i)
ans = (ans + (p.val[n][i]*a[i])%N)%N;
printf("%I64d\n", ans);
}
return 0;
}

ACM学习历程——HDU5015 233 Matrix(矩阵快速幂)(2014陕西网赛)的更多相关文章

  1. HDU5015 233 Matrix —— 矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-5015 233 Matrix Time Limit: 10000/5000 MS (Java/Others)    Memor ...

  2. ACM学习历程——HDU5017 Ellipsoid(模拟退火)(2014西安网赛K题)

    ---恢复内容开始--- Description Given a 3-dimension ellipsoid(椭球面) your task is to find the minimal distanc ...

  3. HDU5015 233 Matrix(矩阵高速幂)

    HDU5015 233 Matrix(矩阵高速幂) 题目链接 题目大意: 给出n∗m矩阵,给出第一行a01, a02, a03 ...a0m (各自是233, 2333, 23333...), 再给定 ...

  4. 233 Matrix 矩阵快速幂

    In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233 ...

  5. HDU - 5015 233 Matrix (矩阵快速幂)

    In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233 ...

  6. 233 Matrix(矩阵快速幂+思维)

    In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233 ...

  7. HDU 5015 233 Matrix --矩阵快速幂

    题意:给出矩阵的第0行(233,2333,23333,...)和第0列a1,a2,...an(n<=10,m<=10^9),给出式子: A[i][j] = A[i-1][j] + A[i] ...

  8. ACM学习历程—HDU 5025 Saving Tang Monk(广州赛区网赛)(bfs)

    Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great Classi ...

  9. ACM学习历程—HDU 5446 Unknown Treasure(数论)(2015长春网赛1010题)

    Problem Description On the way to the next secret treasure hiding place, the mathematician discovere ...

随机推荐

  1. python学习(十)赋值、表达式、if、while、for

    明天以搞定这几个应该不难 赋值.表达式.if.while.for 函数.作用域.参数.函数高级话题 迭代和解析一.二 还有我的<30天自制操作系统>没看 #!/usr/bin/python ...

  2. Microsoft-office 常见问题

    1.工作表写入保护,忘记密码,解决办法: 流程如下: 1打开文件2工具---宏----录制新宏---输入名字如:aa3停止录制(这样得到一个空宏)4工具---宏----宏,选aa,点编辑按钮5删除窗口 ...

  3. Unable to save settings: Failed to save settings. Please restart PyCharm解决

    将工程的.ideas目录删掉,重启pycharm即可.

  4. 图像检测之sift and surf---sift中的DOG图 surf hessian

    http://www.cnblogs.com/tornadomeet/archive/2012/08/17/2644903.html http://www.cnblogs.com/slysky/arc ...

  5. WPF之DataGrid篇:DataGridComboBoxColumn

    准备数据源   1 准备数据源.基类为Student,数据对象为Student3,数据集为StuList3. END 编辑DataGrid显示列   1 若要填充下拉列表,请首先使用下列选项之一设置 ...

  6. EasyNVR无插件流媒体服务器前端技术防止重复提交的方法

    现在随着接触EasyNVR时间越来越长,越发的觉得EasyNVR真的是一个"神器".从功能上来说自身不仅可以拉出来使用(具体功能搜索EasyNVR一定有惊喜!),也可以作为设备端与 ...

  7. EasyNVR无插件播放HLS/RTMP网页直播方案前端完善:监听表单变动

    在上一篇博客中我们表述完了防止提交成功后多余操作提交的一个过程:其中的精髓在于ajax的触发事件的使用. 而这篇博客主要想说明一下如何实时的判断出表单是否发生变化. 问题表述: 在网页前端的开发过程中 ...

  8. 【WinForm】创建自定义控件(转)

    转自:http://www.cnblogs.com/bomo/archive/2012/12/09/2810559.html 虽然VS为我们提供了很多控件可以使用,但有时候这些控件仍然不能满足我们的要 ...

  9. cocos2d-js添加百度MSSP插屏(通过jsb反射机制)

    1.导入jar包.... 2.修改AndroidManifest.xml文件 添加: <meta-data android:name="BaiduMobAd_APP_ID" ...

  10. squid代理缓存服务器

    参考文章 http://www.cnblogs.com/mchina/p/3812190.html ;