题意:给你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. mechanize (1)

    最近看的关于网络爬虫和模拟登陆的资料,发现有这样一个包 mechanize ['mekə.naɪz]又称为机械化的意思,确实文如其意,确实有自动化的意思. mechanize.Browser and ...

  2. SNF快速开发平台MVC-甘特图

    上个月做了CS框架的甘特图样例,本月框架组人员又实现了BS的甘特图效果,而且效果也很不错哦 图形框可以直接拖拽调整时长时间: 新增节点:

  3. xml解析、写入遇到的坑

    前言 最近在看一个线上xml文件导出的问题,需求如下: 从我们平台导出一个后缀为tmx的术语语料数据(实际内容为xml文件),然后导入到其他第三方平台发现无法导入. 从其他平台导入的tmx文件无法导入 ...

  4. Android webview clearHistory 不符合逾期的解决办法

    目前在业务开发中有这么一个需求,切换不同的 Fragment, 切换回 WebView 的Fragment时候,要求是打开的初始页面,然后我在 onHiddenChanged() 方法中加载默认地址, ...

  5. java证书

    默认情况下,密钥项存储在.keystore文件中,而可信的CA证书项存储在.cacerts文件中,该文件位于JRE安全目录中. 想在Linux环境下,用keytool命令检查一下一个证书,打keyto ...

  6. [Big Data - Kafka] kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  7. Node入门教程(11)第九章:Node 的网络模块

    net网络模块 net模块是node对TCP或者IPC开发的封装,包括了客户端和服务器端相关API.对于阅读本文,请您有一定的网络编程的基础.您需要已经了解了: ip协议,会配置ip地址 了解dns解 ...

  8. spring quartz1.8.6集群结算服务定时任务与appserver独立分开

    1.quartz集群如何处理同一个数据库,同一套sqtz表的lock问题,否则会导致打架. 思路如下: 1.com.xxx.quartz.BeanInvokingJobDetailFactoryBea ...

  9. [JS] ECMAScript 6 - Set & Map : compare with c#

    Ref: Set 和 Map 数据结构 Day 0 - 1所学

  10. Java虚拟机(二):Java GC算法 垃圾收集器

    概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本地方 ...