如今走过这世间 题解
[D] 如今走过这世间 题解
更新:感谢 @Alphas 指出复杂度笔误。
Subtask 0
样例解释中说每种以
时间复杂度:
Subtask 2
只有一种视频,只能一直发布它,故总收益
时间复杂度:
Subtask 4
设
时间复杂度:
Subtask 5
每个视频的收益保持不变,计算平均收益后乘以视频总数即可。注意第一个视频是特殊的。
时间复杂度:
Subtask 6
考虑构造
时间复杂度:
Subtask 7
从 Subtask 4 的思路出发,注意到正着 dp 会受到粉丝数的影响,考虑从后往前 dp。粉丝数的倍数变化相当于之后的收益都将乘以该倍数,倒着 dp 即可。
令第
边界条件
时间复杂度:
Subtask 8
注意到 Subtask 7 的式子事实上只有加法和乘法,因此考虑构造矩阵。初始(边界条件)时矩阵(位置从
注意共
变换矩阵形如:
注意要把输入的行列反一下(即将输入的
时间复杂度:
代码
#include <bits/stdc++.h>
using namespace std;
inline void train() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
constexpr int N = 103;
using value_type = long long;
constexpr long long MODER = 998244353;
long long timing;
long long inved[N][N];
struct matrix {
matrix(int d1, int d2) : d1(d1), d2(d2) {
for (int i = 0; i < d1; i++) {
for (int j = 0; j < d2; j++) {
va[i][j] = 0;
}
}
}
int d1, d2;
value_type va[N][N];
};
matrix unit_gen(int s) {
matrix ans = matrix(s,s);
for (int i = 0; i < s; i++) {
ans.va[i][i] = 1;
}
return ans;
}
matrix operator * (const matrix &a, const matrix &b) {
int d1 = a.d1, d2 = b.d2, p = a.d2;
if (p != b.d1) {
throw exception();
}
matrix ans = matrix(d1, d2);
for (int r1 = 0; r1 < d1; r1++) {
for (int r2 = 0; r2 < d2; r2++) {
for (int rp = 0; rp < p; rp++) {
ans.va[r1][r2] = (ans.va[r1][r2] + (a.va[r1][rp] * b.va[rp][r2]) % MODER) % MODER;
}
}
}
return ans;
}
long long fastpow(long long a, long long b) {
if (b <= 0) return 1ll;
else if (b&1) return a * fastpow(a, b-1) % MODER;
else {
long long v = fastpow(a, b>>1);
return v * v % MODER;
}
}
matrix fastpow(matrix x, long long val) {
int s = x.d1;
if (x.d2 != s) {
throw exception();
}
matrix src = unit_gen(s);
while (val) {
if (val & 1) {
src = src * x;
}
x = x * x;
val >>= 1;
}
return src;
}
long long n;
int t,k,v,g;
long long b[N], d[N][N];
int main() {
train();
timing = fastpow(100, MODER-2);
cin>>n>>t>>k>>v>>g;
matrix last(1, t+1), transform(t+1, t+1);
last.va[0][0] = 1;
transform.va[0][0] = 1;
for (int i = 1; i <= t; i++) {
cin>>b[i];
last.va[0][i] = b[i];
transform.va[0][i] = b[i];
}
long long tdiv = fastpow(t, MODER-2);
for (int i = 1; i <= t; i++) {
for (int j = 1; j <= t; j++) {
cin>>d[i][j];
d[i][j] = d[i][j] * timing % MODER;
}
}
for (int i = 1; i <= t; i++) {
for (int j = 1; j <= t; j++) {
transform.va[j][i] = d[i][j] * tdiv % MODER;
}
}
matrix res = last * fastpow(transform, n-1);
cout<<res.va[0][v] * k % MODER<<endl;
//cout<<flush;
return 0;
}