题意:给你N个数,1~N分别为num[i],  以及T个 (i,j,P)

对于每组(i,j,P),让你将  num[i] 减去 P*num[i]  再把 P*num[i] 加到 num[j] 上。T个操作同时完成。

这T个操作执行M次(M<1e5)。求最后一个点的值。

题解:将N个值排成一排放到矩阵 1*n B里,我们可以构造一个 n*n 矩阵A,使得 B*A (一个 1*n 的矩阵)的第i列为操作一次后的 第i个数的值。然后就能矩阵快速幂了!

   如何构造? 一列一列构造。

    A的第i列会从上到下依次乘完B,然后加起来作为第i个数的值。于是我们从上到下依次填上p(j,i)(即从j转移到i的数值,j=1 to n,这样就把所有转移到i的数值都加起来了。)。

      现在我们考虑如何表示第i个数值转移的值,注意到A的第i行为p(i,j)(j = 1 to n) 就是所有从i转移到其它数的概率,于是我们对这一行求和得sum,然后将1-sum填入(i,i)。

    这样就构造完成了。

    简单说就是线性变换。

坑:1.visual studio struct里不能定义a[200][200]否则会报错overflow,但oj上能过。

  2.四舍五入不能round,用.0f.

#define _CRT_SECURE_NO_WARNINGS
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<string>
#include<stack>
#include<ctime>
#include<list>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<sstream>
#include<fstream>
#include<iostream>
#include<functional>
#include<algorithm>
#include<memory.h>
//#define INF 0x3f3f3f3f
#define eps 1e-6
#define pi acos(-1.0)
#define e exp(1.0)
#define rep(i,t,n) for(int i =(t);i<=(n);++i)
#define per(i,n,t) for(int i =(n);i>=(t);--i)
#define mp make_pair
#define pb push_back
#define mmm(a,b) memset(a,b,sizeof(a))
//std::ios::sync_with_stdio(false);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
void smain();
#define ONLINE_JUDGE
int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
FILE *myfile;
myfile =freopen("C:\\Users\\SuuTT\\Desktop\\test\\in.txt", "r", stdin);
if (myfile == NULL)
fprintf(stdout, "error on input freopen\n");
/*FILE *outfile;
outfile= freopen("C:\\Users\\SuuTT\\Desktop\\test\\out.txt", "w", stdout);
if (outfile == NULL)
fprintf(stdout, "error on output freopen\n");*/
long _begin_time = clock();
#endif
smain();
#ifndef ONLINE_JUDGE
long _end_time = clock();
printf("time = %ld ms.", _end_time - _begin_time);
#endif
return ;
}
int dir[][] = { ,,,,-,,,- };
const int maxn = 2e2 + ;
int n, m;
struct matrix {
double mat[maxn][maxn];
int r, c;
matrix(int rr, int cc) {
rep(i, , rr)rep(j, , cc) mat[i][j] = ;
r = rr, c = cc;
}
void init(int rr, int cc,int val) {
rep(i, , rr)rep(j, , cc) mat[i][j] = val;
r = rr, c = cc;
}
matrix friend operator *(matrix a, matrix b) {
matrix ans(a.r, b.c);
if (a.c != b.r) {
cout << "ERROR"; return ans;
}
rep(i,,a.r)rep(j,,b.c)rep(k, , a.c) { ans.mat[i][j] += a.mat[i][k] * b.mat[k][j]; }
return ans;
}
};
matrix a(maxn, maxn), b(, maxn);
matrix temp(maxn,maxn);
double self[maxn];
void Run() { }
void quickpow(matrix a, int n) { temp.init(a.r, a.c, );
rep(i, , a.r) temp.mat[i][i] = ;
while (n) {
if (n & ) temp = temp*a;
a = a*a; n >>= ;
} }
void smain() {
while (cin >> n>>m)
{
if (!n && !m)break;
a.init(n, n,);
b.init(,n,); fill(self, self + + n, 1.0);
rep(i, , n)cin >> b.mat[][i];
int t; cin >> t;
while (t--) {
int x, y; double p;
cin >> x >> y >> p; x++, y++;
a.mat[x][y] = p;
self[x] -= p;
}
rep(i, , n)a.mat[i][i] = self[i]; quickpow(a, m);
b = b*temp;
//cout << round(b.mat[1][n])<<endl;
printf("%.0f\n", b.mat[][n]);
}
}
/* 2 30
100 20
1
0 1 0.5
4 100
1000 2000 3000 0
3
0 1 0.19
1 2 0.05
0 2 0.67
*/

        

ZOJ - 2853 Evolution 线性变换变成矩阵快速幂的更多相关文章

  1. ZOJ 2853 Evolution 【简单矩阵快速幂】

    这道题目第二次看的时候才彻底理解了是什么意思 把题目转化为数学模型分析后就是 有一个初始序列, 有一个进化率矩阵 求的是初始序列 与进化率矩阵进行 m 次运算后, 初始序列最后一位的答案 那么显然,可 ...

  2. zoj 2974 Just Pour the Water (矩阵快速幂,简单)

    题目 对于案例的解释请见下图: 这道要变动提取一下矩阵,之后就简单了 具体解释可看代码: #include <string.h> #include <stdio.h> #inc ...

  3. ZOJ 2794 Just Pour the Water 【矩阵快速幂】

    给你n个杯子,每次有特定的到水规则,倒m次请问最后每个被子里还有多少水 我们很容易发现每次变化的规则相同,那么可以set 一个矩阵存放 然后多次倒水就相当于矩阵相乘,在m 范围达到(1<= M  ...

  4. zoj 2974 Just Pour the Water矩阵快速幂

    Just Pour the Water Time Limit: 2 Seconds      Memory Limit: 65536 KB Shirly is a very clever girl. ...

  5. 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

    题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...

  6. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...

  7. 51nod 1113 矩阵快速幂

    题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...

  8. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

  9. HDU5950(矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:f(n) = f(n-1) + 2*f(n-2) + n^4,f(1) = a , f(2 ...

随机推荐

  1. 简单的topK问题

    /************************************************************************/ /* 求一组数据中的top(K)问题,这是一个经典 ...

  2. iOS开发 关于启动页和停留时间的设置

    引言: 在开发一款商业App时,我们大都会为我们的App设置一个启动页. 苹果官方对于iOS启动页的设计说明: 为了增强应用程序启动时的用户体验,您应该提供一个启动图像.启动图像与应用程序的首屏幕看起 ...

  3. FTP实验

    一.安装 sudo apt-get install vsftpd service vsftpd start 启动vsftpd服务 如果在不设置任何的情况下,可以以匿名的方式访问该ftp. 这时候你可以 ...

  4. 【测量实战技术】Cad中导入坐标高程点并可以提取坐标带高程

    一般咱们都是导入cad的是坐标不带高程,那么怎么在cad中导入坐标高程的三维坐标呢,在不需要cass的情况下还能计算方量呢?而且还能批量提取出这些坐标高程的三维参数. 这些都是工作中非常常用的技能,不 ...

  5. 水塘抽样(Reservoir Sampling)问题

    水塘抽样是一系列的随机算法,其目的在于从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到主内存的情况. 在高德纳的计算机程序设计艺术中,有如下问题: ...

  6. 使用ActivityGroup需要注意的地方

    Group里面的所有“孩子Activity”不能直接调用finish(),只能等ActivityGroup调用它自己的finish()后,会自动调用所有“孩子Activity”的finish().

  7. Java知多少(89)列表和组合框

    有两种类型的菜单:下拉式菜单和弹出式菜单.本章只讨论下拉式菜单编程方法.菜单与JComboBox和JCheckBox不同,它们在界面中是一直可见的.菜单与JComboBox的相同之处是每次只可选择一个 ...

  8. python笔记2-数据类型:列表[List]常用操作

    序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,索引从0开始,依此类推. 序列都可以进行的操作:包括 索引,切片,加,乘,检查成员. 列表是最常用的Pyth ...

  9. Android四大组件之——Activity(一)定义、状态和后退栈(图文详解)

    什么是Activity 关键字:应用组件.四大组件.用户界面,交互. An Activity is an application component that provides a screen wi ...

  10. laravel 5 : Class 'input' not found

     在配置文件中:config\app.php 加上 'Input' => Illuminate\Support\Facades\Input::class, 或者 引用 :use Illumina ...