ACM学习历程——HDU5015 233 Matrix(矩阵快速幂)(2014陕西网赛)
Description
Input
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
Sample Input
1
2 2
0 0
3 7
23 47 16
Sample Output
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陕西网赛)的更多相关文章
- HDU5015 233 Matrix —— 矩阵快速幂
题目链接:https://vjudge.net/problem/HDU-5015 233 Matrix Time Limit: 10000/5000 MS (Java/Others) Memor ...
- ACM学习历程——HDU5017 Ellipsoid(模拟退火)(2014西安网赛K题)
---恢复内容开始--- Description Given a 3-dimension ellipsoid(椭球面) your task is to find the minimal distanc ...
- HDU5015 233 Matrix(矩阵高速幂)
HDU5015 233 Matrix(矩阵高速幂) 题目链接 题目大意: 给出n∗m矩阵,给出第一行a01, a02, a03 ...a0m (各自是233, 2333, 23333...), 再给定 ...
- 233 Matrix 矩阵快速幂
In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233 ...
- HDU - 5015 233 Matrix (矩阵快速幂)
In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233 ...
- 233 Matrix(矩阵快速幂+思维)
In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233 ...
- 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] ...
- ACM学习历程—HDU 5025 Saving Tang Monk(广州赛区网赛)(bfs)
Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great Classi ...
- ACM学习历程—HDU 5446 Unknown Treasure(数论)(2015长春网赛1010题)
Problem Description On the way to the next secret treasure hiding place, the mathematician discovere ...
随机推荐
- 优秀JS学习站点
第一个:电子书类集合站点:http://www.javascriptcn.com/thread-2.html 第二类:移动端博客学习: https://segmentfault.com/a/11900 ...
- xml 操作
/////////////////////////////////jaxp对xml文档进行解析/////////////////////////////////////////// 要操作的xml文件 ...
- sed: -e expression #1, unknown option to `s'解决办法
报错如下: sed: -e expression #1, char 13: unknown option to `s' 需要替换的行为: monitor.url=http://192.168.25.1 ...
- PowerBuilder -- 条码打印
# 使用ocx控件 使用微软的MSBCODE9.OCX,但是注册老不成功,需要安装office之后才能注册成功,不知道有没有好的处理方法?? # 使用字体 字体下载:http://download.c ...
- N皇后问题算法
N皇后问题的两种主要算法是试探回溯法和位运算法.前一种是经典算法,后一种是目前公认的最高效算法,后者比前者效率提高了至少一个数量级.很多问题可以借鉴位运算的思想. 以下是转载的我认为写的比较好的一篇N ...
- Bloom Filters
http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html A Bloom filter is a method for represe ...
- iOS 流布局 UICollectionView使用(使用FlowLayout进行更灵活布局)
在UICollectionView的布局中,如果每个item的大小都一样那么是十分简单的事情,但是,如果我们想要的每个item大小不一样呢,这个时候,就要对UICollectionViewFlowLa ...
- Hadoop实战-Flume之Sink Load-balancing(十七)
a1.sources = r1 a1.sinks = k1 k2 a1.channels = c1 # Describe/configure the source a1.sources.r1.type ...
- 去ioe
http://baike.baidu.com/link?url=ntILcQyM_S7rpsbUrVu7vLEKHXNfSlJyWdWQnUo9LYO7JfoOpDEvbKldXobL0_nUEkXn ...
- Django框架ORM单表删除表记录_模型层
此方法依赖的表是之前创建的过的一张表 参考链接:https://www.cnblogs.com/apollo1616/p/9840354.html 1.删除方法就是delete(),它运行时立即删除对 ...