1 条题解

  • 0
    @ 2026-3-8 9:58:45

    虽然说理论上有点极限,但O(NX)O(NX)是没有问题的,还有点小快,峰值时间才39ms。

    思路

    考虑概率DP。fif_i表示第i秒时切歌(一首歌结束)的概率,枚举iijj表是第几秒和上一首是第几首,转移方程详见代码。最终答案其实就是i=max(Xa[1]+1,0)XFi/N\displaystyle\sum_{i=max(X-a[1]+1,0)}^{X} F_i/N,也就是最后一次切歌切到第1收的概率之和

    AC代码

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int N=1e4+10,P=998244353;
    int qpow(int a,int b)
    {
    	int res=1;
    	for(;b;b>>=1,a=a*a%P)if(b&1)res=res*a%P;
    	return res;
    }
    int f[N],a[N];
    signed main()
    {
    	int n,x;scanf("%lld%lld",&n,&x);
    	int _n=qpow(n,P-2);
    	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    	f[0]=1;
    	for(int i=1;i<=x;i++)for(int j=1;j<=n;j++)
    	{
    		if(i>=a[j])f[i]=(f[i]+_n*f[i-a[j]]%P)%P;
    	}
    	int ans=0;
    	for(int i=max(0ll,x-a[1]+1);i<=x;i++)ans=(ans+_n*f[i]%P)%P;
    	printf("%lld\n",ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    8812
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    3
    已通过
    2
    上传者