列表

详情


NC217944. RandomeatCake

描述

块蛋糕,牛妹将等概率随机生成一个整数序列满足以下条件:


注:当,可以生成序列,每种序列生成的概率为

为整数构成的集合,随后牛妹重复以下操作次:
中随机选择一个整数,并连续吃掉块蛋糕获得的快乐值,再将从集合中移除。

牛妹快乐为他在吃蛋糕的过程中获得的所有快乐值之和。求牛妹快乐期望值是多少,对答案

有理数对取模:答案可以表示成的形式,在意义下存在唯一的整数使得,输出这个

输入描述

输入包含输入包含组测试用例,第一行一个整数
每组测试用例一个整数

输出描述

输出行,第行为第组测试用例的答案。

示例1

输入:

5
2
2333
8888
5
9

输出:

748683266
692154118
83775325
17157327
225628713

说明:

{n=2}
若牛妹先吃{1}块蛋糕,再吃{1}块蛋糕,将获得{2}的快乐。
若牛妹直接吃{2}块蛋糕,则获得\frac{1}{2}的快乐。
快乐期望为\frac{2+\frac{1}{2}}{2}=\frac{5}{4}

原站题解

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

C++ 解法, 执行用时: 136ms, 内存消耗: 408K, 提交时间: 2021-05-22 10:48:39

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
const int mod=998244353;
ll qmi(ll a,int b)
{
	if(b<0)
	return 0;
	ll res=1;
	while(b)
	{
		if(b&1)	res=res*a%mod;
		b>>=1;
		a=a*a%mod;
	}

	return res;
}
signed main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin >> n;
		ll res=0;
		ll inv=1;
		for(int i=1;i<=n;i++)
		{
			inv=qmi(i,mod-2)*inv%mod;
			ll res2=0;
			res2=(res2+qmi(2,n-i))%mod;
			res2=(res2+(n-i-1 >=0 ? n-i-1:0)*qmi(2,n-i-2)%mod)%mod;
			res2=res2*inv%mod;
			res=(res+res2)%mod;
		}
	//	cout<<res<<endl;
		res=res*qmi(qmi(2,n-1),mod-2)%mod;
		cout<<res<<endl;
	}
	
	return 0;

}

pypy3(pypy3.6.1) 解法, 执行用时: 545ms, 内存消耗: 31940K, 提交时间: 2021-05-14 21:48:02

M = 998244353
def inv(x): return pow(x,M-2,M)
dp = [0]*500005
sumdp = 0
h = [0]*500005
invfact = [1] * 500005
for n in range(1,500001):
    invfact[n] = invfact[n-1]*inv(n) %M
    if n>1: h[n] = (h[n-1]*2 + invfact[n-1])%M
    dp[n] = (sumdp + h[n] + invfact[n])%M
    sumdp = (sumdp + dp[n]) %M

t = int(input())
while t:
    t -= 1
    n = int(input())
    #print(n,':', dp[n])
    print(dp[n] * inv(pow(2,n-1,M))%M)

上一题