HDU5015 233 Matrix(矩阵高速幂)
HDU5015 233 Matrix(矩阵高速幂)
题目大意:
给出n∗m矩阵,给出第一行a01,
a02, a03 ...a0m (各自是233, 2333, 23333...), 再给定第一列a10, a10, a10, a10,...an0.矩阵中的每一个元素等于左边的加上上面的,求出anm.
解题思路:
先要依据矩阵元素的特征得出相乘的矩阵T, 然后就是求这个矩阵T的m次幂(这里就能够用矩阵高速幂),最后再和给定的第一列所形成的矩阵相乘,就能得到anm。
求矩阵T请參考
代码:
#include <cstdio>
#include <cstring>
typedef long long ll;
const int N = 15;
const ll MOD = 10000007;
ll A[N][N];
int B[N];
int n;
ll m;
struct Rec {
ll v[N][N];
Rec () { memset (v, 0, sizeof (v));}
void init () {
for (int i = 0; i < n + 2; i++)
for (int j = 0; j < n + 2; j++)
v[i][j] = A[i][j];
}
Rec operator * (const Rec &a) {
Rec tmp;
for (int i = 0; i < n + 2; i++)
for (int j = 0; j < n + 2; j++)
for (int k = 0; k < n + 2; k++)
tmp.v[i][j] = (tmp.v[i][j] + (v[i][k] * a.v[k][j]) % MOD) % MOD;
return tmp;
}
Rec operator *= (const Rec &a) {
return *this = *this * a;
}
}num;
void init () {
memset (A, 0, sizeof (A));
for (int i = 0; i < n + 1; i++) {
A[i][0] = 10LL;
A[i][n + 1] = 1LL;
}
A[n + 1][n + 1] = 1LL;
for (int i = 1; i < n + 1; i++)
for (int j = 1; j <= i; j++)
A[i][j] = 1LL;
B[0] = 23;
}
Rec f(ll m) {
if (m == 1)
return num;
Rec tmp;
tmp = f(m / 2);
tmp *= tmp;
if (m % 2)
tmp *= num;
return tmp;
}
int main () {
while (scanf ("%d%lld", &n, &m) != EOF) {
for (int i = 1; i <= n; i++)
scanf ("%d", &B[i]);
init();
B[n + 1] = 3;
num.init ();
num = f(m);
/* for (int i = 0; i <= n + 1; i++) {
for (int j = 0; j <= n + 1; j++)
printf ("%lld ", num.v[i][j]);
printf ("\n");
}*/
ll ans = 0;
for (int i = 0; i <= n + 1; i++)
ans = (ans + (num.v[n][i] * B[i]) % MOD) % MOD;
printf ("%lld\n", ans);
}
return 0;
}
HDU5015 233 Matrix(矩阵高速幂)的更多相关文章
- HDU5015 233 Matrix —— 矩阵快速幂
题目链接:https://vjudge.net/problem/HDU-5015 233 Matrix Time Limit: 10000/5000 MS (Java/Others) Memor ...
- 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] ...
- HDU 4965 Fast Matrix Calculation(矩阵高速幂)
HDU 4965 Fast Matrix Calculation 题目链接 矩阵相乘为AxBxAxB...乘nn次.能够变成Ax(BxAxBxA...)xB,中间乘n n - 1次,这样中间的矩阵一个 ...
- [HDU5015]233 Matrix
[HDU5015]233 Matrix 试题描述 In our daily life we often use 233 to express our feelings. Actually, we ma ...
- hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)
http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序.问funny函数调用了多少次. 我们定义数组为所求 ...
- HDU 1575 Tr A(矩阵高速幂)
题目地址:HDU 1575 矩阵高速幂裸题. 初学矩阵高速幂.曾经学过高速幂.今天一看矩阵高速幂,原来其原理是一样的,这就好办多了.都是利用二分的思想不断的乘.仅仅只是把数字变成了矩阵而已. 代码例如 ...
随机推荐
- jvm常用参数设置 good
1.堆的大小可以通过 -Xms 和 -Xmx 来设置,一般将他们设置为相同的大小,目的是避免在每次垃圾回收后重新调整堆的大小,比如 -Xms=2g -Xmx=2g 或者 -Xms=512m -Xmx= ...
- 基于visual Studio2013解决C语言竞赛题之1094纵横图
题目 解决代码及点评 /************************************************************************/ /* ...
- hdu 1262 寻找素数对 数论 打表。
寻找素数对 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 使用Understand获取某个函数(方法)的静态度量指标
在之前的一篇日志中,我简单总结了调用Understand的Perl API的方法,这里再简单总结一些经验: 在SciTools\doc\manuals\pdf目录下的understand_api.pd ...
- 获取Exe文件版本信息的函数(使用GetFileVersionInfo得到TFileVersionInfo结构体,包含12项内容)
Type TFileVersionInfo = Record FixedInfo:TVSFixedFileInfo; {版本信息} Comp ...
- Windows查看进程taskList,终止进程tskill
TaskList: 列出当前所有运行进程. 使用方法:在命令提示符中输入tasklist 然后回车,会看到类似下面的列表: 映像名称 ...
- 每天一个JavaScript实例-动态省份选择城市
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- oracle 在操作blob该字段是否会产生很多redo
操作blob该字段是否会产生很多redo,答案是否定的.以下来做一个实验,測试数据库版本号是11.2.0.1.0: --创建一张表做測试之用 create table test_blob ( id ...
- ural 1519 Formula 1
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1519 题目分类:插头dp 题意:求经过所有可行点的哈密顿回路的个数 * 不可走 . 可 ...
- POJ 3040 Allowance 贪心
这题目的贪心思路还是有一点细节问题的. 还没有证明,据说是因为题目给的条件是每个价格是比它小的价格的倍数才能这么贪心的. 思路如下: 假设要给奶牛的钱为C 1)从大面值到小面值一次拿钱,能拿多少拿多少 ...