ZOJ - 2853 Evolution 线性变换变成矩阵快速幂
题意:给你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 线性变换变成矩阵快速幂的更多相关文章
- ZOJ 2853 Evolution 【简单矩阵快速幂】
这道题目第二次看的时候才彻底理解了是什么意思 把题目转化为数学模型分析后就是 有一个初始序列, 有一个进化率矩阵 求的是初始序列 与进化率矩阵进行 m 次运算后, 初始序列最后一位的答案 那么显然,可 ...
- zoj 2974 Just Pour the Water (矩阵快速幂,简单)
题目 对于案例的解释请见下图: 这道要变动提取一下矩阵,之后就简单了 具体解释可看代码: #include <string.h> #include <stdio.h> #inc ...
- ZOJ 2794 Just Pour the Water 【矩阵快速幂】
给你n个杯子,每次有特定的到水规则,倒m次请问最后每个被子里还有多少水 我们很容易发现每次变化的规则相同,那么可以set 一个矩阵存放 然后多次倒水就相当于矩阵相乘,在m 范围达到(1<= M ...
- zoj 2974 Just Pour the Water矩阵快速幂
Just Pour the Water Time Limit: 2 Seconds Memory Limit: 65536 KB Shirly is a very clever girl. ...
- 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...
- 51nod 算法马拉松18 B 非010串 矩阵快速幂
非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...
- 51nod 1113 矩阵快速幂
题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
- 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 ...
随机推荐
- Android 组件系列-----Activity初步
在上篇博文讲解了Android的Activity这个组件的启动流程后,接下来我们就来看看我们的Activity与我们的布局文件的关系吧 我们先来看看一个最简单的布局文件的内容: <Relativ ...
- Selenium:注解@FindBy、@FindBys、@FindAll的用法
方式有3种:@FindBy.@FindBys.@FindAll.下文对3中类型的区别和使用场景进行介绍 1)@FindBy @FindBy(id= "A") private Web ...
- IOS 简单的 加减分 动画
使用 shapeLayer 当动画层 其实以前有写过 类似的了 github: https://github.com/li6185377/AddScore self.pregress = [[CAS ...
- java协变逆变,PECS
public static void main(String[] args) { // Object <- Fruit <- Apple <- RedApple System.out ...
- 开始逐步补充下相关Web知识,很多年没搞了....
<script type="text/javascript"> $(function(){ ShowProduct(); $("#ShowUserInfo&q ...
- 如何解决:对应的服务器 tls 为 tls 1.0,小程序要求的TLS版本必须大于等于1.2问题
微信小程序 TLS 版本必须大于等于1.2问题解决 此问题最近在微信小程序开发中,比较常见. 在解决这个问题之前,我们需要了解一下,当前的系统环境是否支持TLS1.2以上,可以参考一下表格: 请先确认 ...
- Tomcat配置多个域名绑定到不同项目
<Host name="www.dn-serve.com" appBase="webapps" unpackWARs="true" a ...
- vue事件处理器
1.监听事件 可以用 v-on 指令监听 DOM 事件来触发一些 JavaScript 代码. 示例: <div id="example-1"> <button ...
- 从去除毛刺的策略看开运算opening_circle和闭运算closing_circle的异同
例一:毛刺在往外凸的面上 策略1:分割出黑色部分,然后通过开运算去掉毛刺,再通过原黑色部分区域减去开运算之后的区域,得到毛刺部分的区域. read_image (Tu, 'C:/Users/xiahu ...
- Java知多少(79)哈希表及其应用
哈希表也称为散列表,是用来存储群体对象的集合类结构. 什么是哈希表 数组和向量都可以存储对象,但对象的存储位置是随机的,也就是说对象本身与其存储位置之间没有必然的联系.当要查找一个对象时,只能以某种顺 ...