列表

详情


NC207547. 牛牛的粉丝

描述

牛牛的粉丝如此之多,以至于为了举办粉丝见面会不得不在一个有 个点的环上举行,环的编号为

对于环上每个点  定义它的顺时针方向的下一个点的是

牛牛打算对粉丝的位置进行 轮调整,但是由于场地过于巨大导致粉丝们听不清牛牛的指令,在每一轮 每一个粉丝都会独立地p_1 的概率向顺时针方向走一步,以 p_2 的概率向逆时针方向走一步,当然也有 p_3 的概率被牛牛帅傻了,站在原地不动。

由于粉丝过多,移动的时候就会很乱 所以牛牛只想知道结果: 轮移动结束后 每个点上人数的期望是多少?答案对  取模。

输入描述

第一行二个正整数 

第二行三个正整数 ,设 ,则

接下来一行  个整数,第  个整数 x_i 表示初始时站在 位置上的粉丝的个数。 

输出描述

输出  个整数 表示每个位置的期望人数。

示例1

输入:

3 1
1 1 1
1 0 0

输出:

332748118 332748118 332748118

说明:

牛牛的粉丝有 \frac{1}{3} 的概率顺时针,逆时针和不动。那么一轮后在每一个位置上的概率都是 \frac{1}{3} 所以每一个位置上人数的期望就是 \frac{1}{3}

示例2

输入:

4 2
1 1 2
1 1 0 0

输出:

374341633 374341633 623902721 623902721

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 319ms, 内存消耗: 504K, 提交时间: 2020-08-29 01:20:31

#include <bits/stdc++.h>

using namespace std;
#define int long long
const int Mod = 998244353;
const int MAXN = 5e2 + 5;
int E[MAXN], t[MAXN], ret[MAXN], F[MAXN]; 
int n, a, b, c;
using LL = long long;
LL k;
LL mpow(LL x, LL b) {
	LL r = 1;
	for (; b; b >>= 1, x = x * x % Mod) 
		if (b & 1) r = r * x % Mod;
	return r;
} 
void mul(int *A, int *B) {
	memset(t, 0, sizeof(t));
	for (int i = 0; i < n; i++) 
		for (int j = 0; j < n; j++) 
			t[i] = (t[i] + (long long)A[j] * B[(n + i - j) % n] % Mod) % Mod;
	for (int i = 0; i < n; i++) 
		A[i] = t[i];
}
signed main() {
	cin >> n >> k >> a >> b >> c;
	
	for (int i = 0; i < n; i++) scanf("%lld", F + i);
	LL s = a + b + c;
	LL p1 = a * mpow(s, Mod - 2) % Mod;
	LL p2 = b * mpow(s, Mod - 2) % Mod;
	LL p3 = c * mpow(s, Mod - 2) % Mod;
	E[n - 1] = p2, E[0] = p3, E[1] = p1;
	ret[0] = 1;
	for (; k; k >>= 1, mul(E, E)) 
		if (k & 1) mul(ret, E);
	mul(F, ret);
	for (int i = 0; i < n; i++) 
		printf("%lld%c", F[i], " \n"[i == n - 1]);
	return 0;
}
/*
https://www.cnblogs.com/Saurus/p/6127478.html
*/

/*
5 10000000000
1 1 2
34 2 23424 4 156
*/

C++ 解法, 执行用时: 424ms, 内存消耗: 536K, 提交时间: 2022-01-18 16:29:29

#include<bits/stdc++.h>
using namespace std;

long long a[510],b[510],mod=998244353;
long long n,K,aa,bb,cc,s;
long long ny;

void mul(long long c[],long long a[],long long b[]){
    long long temp[510]={0};
    for(int i=1;i<=n;i++){
        for(int k=1;k<=n;k++){
            temp[(i+k-2)%n+1]=(temp[(i+k-2)%n+1]+a[i]*b[k])%mod;
        }
    }
    memcpy(c,temp,sizeof temp);
}

void getny(){
    long long res=1,ds=s,p=mod-2;
    while(p){
        if(p&1) res=res*ds%mod;
        ds=ds*ds%mod;
        p>>=1;
    }
    ny=res;
}

int main(){
    cin>>n>>K;
    cin>>aa>>bb>>cc;
    s=aa+bb+cc;
    for(int i=1;i<=n;i++) cin>>a[i];
    getny();
    b[1]=cc*ny%mod,b[2]=aa*ny%mod,b[n]=bb*ny%mod;
    while(K){
        if(K&1) mul(a,a,b);
        mul(b,b,b);
        K>>=1;
    }
    for(int i=1;i<=n;i++) cout<<a[i]<<" ";
    return 0;
}

上一题