Bzoj2510 弱题(矩阵快速幂)

题面(权限题)

题解

一道概率\(dp\),可以设\(f[i][j]\)表示第\(i\)次操作后,标号为\(j\)的小球的期望个数,那么有:
\[
\begin{aligned}
&f[i][j]=(1-\frac 1m)f[i-1][j]+\frac1mf[i-1][j-1](1\leq j\leq n) \&f[i][0]=(1-\frac 1m)f[i-1][j]+\frac1mf[i-1][n]
\end{aligned}
\]
这样的话转移可以写成矩阵的形式(假设有\(4\)个小球):
\[
\begin{aligned}
&\begin{bmatrix}
f[i-1][1]&f[i-1][2]&f[i-1][3]&f[i-1][4]
\end{bmatrix}
\times
\begin{bmatrix}
1-\frac 1m&\frac 1m&0&0\0&1-\frac 1m&\frac 1m&0\0&0&1-\frac 1m&\frac 1m\\frac 1m&0&0&1-\frac 1m
\end{bmatrix}
\\=
&\begin{bmatrix}
f[i][1]&f[i][2]&f[i][3]&f[i][4]
\end{bmatrix}
\end{aligned}
\]
可以发现转移矩阵也是一个循环矩阵,也就是说,可以\(O(n^2log_2k)\)做。

#include <cstdio>
#include <cstring>
#include <algorithm>
using std::min; using std::max;
using std::swap; using std::sort;
typedef long long ll;

template<typename T>
void read(T &x) {
    int flag = 1; x = 0; char ch = getchar();
    while(ch < '0' || ch > '9') { if(ch == '-') flag = -flag; ch = getchar(); }
    while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;
}

const int N = 1e3 + 10;
int n, m, k; double S[N], T[N], tmp[N];

void mul(double S[], double T[]) {
    memset(tmp, 0, sizeof tmp);
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
            tmp[(i + j - 2) % n + 1] += S[i] * T[j];
    memcpy(S, tmp, sizeof tmp);
}

int main () {
    read(n), read(m), read(k);
    for(int i = 1; i <= n; ++i) scanf("%lf", S + i);
    T[1] = 1 - 1.0 / m, T[2]= 1.0 / m;
    for(; k; k >>= 1, mul(T, T)) if(k & 1) mul(S, T);
    for(int i = 1; i <= n; ++i) printf("%.3lf\n", S[i]);
    return 0;
} 

原文地址:https://www.cnblogs.com/water-mi/p/10323958.html

时间: 2024-08-29 10:40:07

Bzoj2510 弱题(矩阵快速幂)的相关文章

BZOJ 2510: 弱题( 矩阵快速幂 )

每进行一次, 编号为x的数对x, 和(x+1)%N都有贡献 用矩阵快速幂, O(N3logK). 注意到是循环矩阵, 可以把矩阵乘法的复杂度降到O(N2). 所以总复杂度就是O(N2logK) ---------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; const int maxn = 1009; int N, M, K,

BNUOJ 34985 Elegant String 2014北京邀请赛E题 矩阵快速幂

题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 题目大意:问n长度的串用0~k的数字去填,有多少个串保证任意子串中不包含0~k的某一个全排列 邀请赛上A的较多的一道题,比赛的时候死活想不出,回来之后突然就想通了,简直..... = =! 解题思路: 对于所有串我们都只考虑末尾最多有多少位能构成全排列的一部分(用l来表示),即最多有多少位不重复的数字出现,将问题转化为求末尾最多有k位能构成全排列的串的总数量 假设k为5,有一个

2014北京邀请赛E题-矩阵快速幂

题意:长度为n(1<=n<=10^18)的并且任意连续子串都不是0-k(1<=k<=9)的一个排列的字符串有多少种. 解法:矩阵快速幂.dp[i][j]表示i长度最后连续j个不同(即最后j个无重复,最后j+1个有重复)的字符串的个数.状态选好很重要.设计状态时最重要考虑是唯一性和可传递性,比赛时明明知道肯定是矩阵快速幂,但是一直没想到这个状态表示,自己设计的自己都不会转移. dp[i][j]有了后,后边加一个字符,这个字符可以是j之内的任意一个,也可以是j以外的,这样枚举每种情况,

UVA 11651 - Krypton Number System(DP+矩阵快速幂)

UVA 11651 - Krypton Number System 题目链接 题意:给一个进制base,一个分数score求该进制下,有多少数满足一下条件: 1.没有连续数字 2.没有前导零 3.分数为score,分数的计算方式为相邻数字的平方差的和 思路:先从dp入手,dp[i][j]表示组成i,最后一个数字为j的种数,然后进行状态转移,推出前面一步能构成的状态,也就是到dp[(b - 1) * (b - 1)][x]. 然后可以发现后面的状态,都可以由前面这些状态统一转移出来,这样就可以利用

(中等) CF 576D Flights for Regular Customers (#319 Div1 D题),矩阵快速幂。

In the country there are exactly n cities numbered with positive integers from 1 to n. In each city there is an airport is located. Also, there is the only one airline, which makes m flights. Unfortunately, to use them, you need to be a regular custo

BNUOJ 34985 Elegant String 2014北京邀请赛E题 动态规划 矩阵快速幂

Elegant String Time Limit: 1000msMemory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main We define a kind of strings as elegant string: among all the substrings of an elegant string, none of them is a permutation of "0, 1,-, k

2014 BNU 邀请赛E题(递推+矩阵快速幂)

Elegant String 题意:给定一个字符串,由0-k数字组成,要求该串中,子串不包含0-k全排列的方案数 思路:dp[i][j]表示放到i个数字,后面有j个不相同,然后想递推式,大概就是对应每种情况k分别能由那几种状态转移过来,在纸上画画就能构造出矩阵了,由于n很大,所以用快速幂解决 代码: #include <stdio.h> #include <string.h> const long long MOD = 20140518; int t; long long n; i

软件能力认证题---拼图(状态压缩DP+矩阵快速幂)

题意: 给定n*m的棋盘(1<=N<=10^15, 1<=M<=7),用L型骨牌(田字型任意去掉一个口)完全覆盖它,问有多少种解. 思路:m的范围只有1<=M<=7,显然状压DP.但是N的最大值到10^15,只能用快速幂了. 状态表示:0代表此处留空,1代表此处被填满.01序列压缩成一个int型来表示一行的填放情况.(例如:状态为4,则代表100,即第一列填满,第二第列三空) 边界条件: 其中, t = 2^M  代表将前i-1行填满,且第i行放置了状态s时的总方案数.

POJ 3613 Cow Relays (Floyd + 矩阵快速幂 + 离散化 神题!)

Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5611   Accepted: 2209 Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race using the T (2 ≤ T ≤ 100) cow trails throughout

HDU——1005Number Sequence(模版题 二维矩阵快速幂+操作符重载)

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 148003    Accepted Submission(s): 35976 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A