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. 用C语言解决迷宫问题

    #include <stdio.h> #include <stdlib.h> #define ROW 10 #define COL 10 /*迷宫中位置信息*/ typedef ...

  2. 蓝桥杯OJ PREV-19 九宫重排

    题目描写叙述:   历届试题 九宫重排   时间限制:1.0s   内存限制:256.0MB        问题描写叙述 如以下第一个图的九宫格中,放着 1~8 的数字卡片.另一个格子空着.与空格子相 ...

  3. js嵌套Struts2标签

    在页面中如果想要在js代码块里面获取到某些值,而这些值是通过Struts的标签取到的, 如: var operatorType = '<s:property value="#sessi ...

  4. WPF中的ListBox实现按块显示元素的方法

    本文实例讲述了WPF中的ListBox实现按块显示元素的方法.分享给大家供大家参考,具体如下: 注意:需要设置ListBox的属性 ScrollViewer.HorizontalScrollBarVi ...

  5. programming review (c++): (2)binary tree, BFS, DFS, recursive, non-recursive

    1.二叉树定义 // Definition for a binary tree node. struct TreeNode { int val; TreeNode *left; TreeNode *r ...

  6. java 多参实现

    package com.northeasttycoon.monitor.service; import static java.lang.System.out; /** * Created by no ...

  7. WCP源码分析 与SpringMVC学习资料

    1.在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便. Spring2.5为我们引入了组件自动扫描机制,他可以在 ...

  8. java中随机生成汉字

    main方法中使用: //随机生成100个汉字 String ss=""; for(int i=0;i<100;i++){ ss+=getChinese(i); } Syst ...

  9. kafka source type

    https://flume.apache.org/FlumeUserGuide.html # example.conf: A single-node Flume configuration # Nam ...

  10. SASL mechanism

    <property> <name>hive.spark.client.rpc.sasl.mechanisms</name> <value>DIGEST- ...