qwq


題目大意

C 現在有 \(n\) 個分身,每個分身有 \(a_i\) 個獎杯。

現在會按照從 \(1\)\(n\) 的順序,每個分身會將自己有的所有獎杯一個一個地隨機地分給其它 \(n - 1\) 個分身。

問最后每個分身期望有的獎杯的個數,對 \(998244353\) 取模。

對於 \(100\%\) 的數據,\(2 \le n \le 10^6\), \(0 \le a_i < 998244353\)

解題思路

簡單的數學期望。

不會的點 這里

顯然有暴力,\(\mathcal O(n^2)\)

for(int i = 1; i <= n; ++i)
{
	for(int j = 1; j <= n; ++j)
	{
		if(i == j) continue;
		f[j] = f[j] + f[i] * x % mod;
		f[j] = f[j] % mod;
	}
	f[i] = 0;
}

線段樹優化,\(\mathcal O(n \log n)\),可過。

#include <bits/stdc++.h>

using namespace std;

#define int long long

int read()
{
	int x = 0, f = 1;
	char c = getchar();
	while (c < '0' || c > '9')
	{
		if(c == '-') f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9')
	{
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x * f;
}

int n;

int a[1000007];

int f[1000007];

const int mod = 998244353;

int tr[1000007 << 2], lazy[1000007 << 2];

void push_down(int o, int l, int r)
{
	if(lazy[o])
	{
		int mid = (l + r) >> 1;
		tr[o << 1] = (tr[o << 1] + (mid - l + 1) * lazy[o] % mod) % mod;
		tr[o << 1 | 1] = (tr[o << 1 | 1] + (r - mid) * lazy[o] % mod) % mod;
		lazy[o << 1] = (lazy[o << 1] + lazy[o]) % mod;
		lazy[o << 1 | 1] = (lazy[o << 1 | 1] + lazy[o]) % mod;
		lazy[o] = 0;
	}
}

void build(int o, int l, int r)
{
	if(l == r)
	{
		tr[o] = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(o << 1, l, mid);
	build(o << 1 | 1, mid + 1, r);
	tr[o] = (tr[o << 1] + tr[o << 1 | 1]) % mod;
}

void update(int o, int l, int r, int L, int R, int k)
{
	if(L <= l && r <= R)
	{
		tr[o] = (tr[o] + (r - l + 1) * k % mod) % mod;
		lazy[o] = (lazy[o] + k) % mod;
		return;
	}
	int mid = (l + r) >> 1;
	push_down(o, l, r);
	if(L <= mid) update(o << 1, l, mid, L, R, k);
	if(R > mid) update(o << 1 | 1, mid + 1, r, L, R, k);
	tr[o] = (tr[o << 1] + tr[o << 1 | 1]) % mod;
}

int query(int o, int l, int r, int L, int R)
{
	if(L <= l && r <= R)
	{
		return tr[o];
	}
	int mid = (l + r) >> 1;
	push_down(o, l, r);
	int res = 0;
	if(L <= mid) res = (res + query(o << 1, l, mid, L, R) % mod) % mod;
	if(R > mid) res = (res + query(o << 1 | 1, mid + 1, r, L, R) % mod) % mod;
	tr[o] = (tr[o << 1] + tr[o << 1 | 1]) % mod;
	return res % mod;
}

int qpow(int x, int y)
{
	int ans = 1ull;
	while(y)
	{
		if(y % 2 == 1ull) ans = ans * x % mod;
		x = x * x % mod;
		y /= 2;
	}
	return ans % mod;
}

signed main()
{
	n = read();
	int x = qpow(n - 1, mod - 2) % mod;
	for(int i = 1; i <= n; ++i)
	{
		a[i] = read();
	}
	build(1, 1, n);
	for(int i = 1; i <= n; ++i)
	{
		int p = query(1, 1, n, i, i);
		if(i == 1)
		{
			update(1, 1, n, i + 1, n, p % mod * x % mod);
		}
		else if(i == n)
		{
			update(1, 1, n, 1, i - 1, p % mod * x % mod);
		}
		else
		{
			update(1, 1, n, 1, i - 1, p % mod * x % mod);
			update(1, 1, n, i + 1, n, p % mod * x % mod);
		}
		update(1, 1, n, i, i, -p);
	}
	for(int i = 1; i <= n; ++i)
	{
		int p = query(1, 1, n, i, i);
		printf("%lld%s", p, i == n ? "\n" : " ");
	}
	return 0;
}

根據期望線性,可以設 \(f_i\) 表示操作到第 \(i\) 個分身時第 \(i\) 個分身獎杯的期望個數。

那么 \(ans_i\) 就是所有 $j > i 的 $ \(\frac{f_j}{n - 1}\) 的和,\(f_i\) 的轉移也是類似的。

時間復雜度 \(\mathcal O(n)\)

CODE

#include <bits/stdc++.h>

#define int long long

using namespace std;

int read()
{
    int x = 0, f = 1;
    char c = getchar();
    while (c < '0' || c > '9')
    {
        if(c == '-') f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9')
    {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}

int n;

const int mod = 998244353;

int a[1000007];

int sum;

int ans[1000007];

int p;

int qpow(int x, int y)
{
	int ans = 1ll;
	while(y)
	{
		if(y & 1) ans = ans * x % mod;
		x = x * x % mod;
		y >>= 1;
	}
	return ans;
}

signed main()
{
	n = read();
	p = qpow(n - 1, mod - 2);
	for(int i = 1; i <= n; ++i)
		a[i] = read();
	for(int i = 1; i <= n; ++i)
	{
		int v = ((a[i] + sum) * p) % mod;
		sum = (sum + v) % mod;
		ans[i - 1] = v;
	}
	for(int i = n; i >= 1; --i)
		ans[i] = (ans[i] + ans[i + 1]) % mod;
	for(int i = 1; i <= n; ++i)
		printf("%lld ", ans[i]);
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM