首页 > 其他分享 >2024.7 - 做题记录与方法总结

2024.7 - 做题记录与方法总结

时间:2024-07-01 19:09:23浏览次数:13  
标签:总结 ch frac 记录 int 2024.7 cdot 黑球 dp

2024/07/01

AtCoder Beginner Contest 360

E - Random Swaps of Balls

期望 \(dp\) 题

问题陈述

有 \(N - 1\) 个白球和一个黑球。这些 \(N\) 个球排成一排,黑球最初位于最左边的位置。

高桥正好要进行下面的操作 \(K\) 次。

  • 在 \(1\) 和 \(N\) 之间均匀随机地选择一个整数,包括两次。设 \(a\) 和 \(b\) 为所选整数。如果是 \(a \neq b\) ,把左边的 \(a\) -th 和 \(b\) -th 两个球交换。

经过 \(K\) 次操作后,让黑球位于左边的 \(x\) -th 位置。求 \(x\) 的期望值,模为 \(998244353\) 。

模数 \(998244353\) 的期望值是多少?
可以证明所求的期望值总是有理数。此外,在本题的限制条件下,还可以证明如果用不可约分数 \(\frac{P}{Q}\) 表示这个值,那么就是 \(Q \not \equiv 0 \pmod{998244353}\) 。因此,存在一个唯一的整数 \(R\) ,使得 \(R \times Q \equiv P \pmod{998244353}, 0 \leq R \leq 998244353\) 。报告这个 \(R\) .

参考了 Lanly 的题解

首先,我们可以看到:对于每一个不为 \(1\) 位置,其价值相等

那么,我们自然设置出状态:

  1. 其在 \(1\) 号位上
  2. 其不在 \(1\) 号位上

对于第 \(i\) 次操作,位于 \(1\) 号位的期望为 \(dp_{i,0}\), 位于非 \(1\) 号位的期望为 \(dp_{i,1}\)

那么,黑球惨遭移动的概率为 $m = 2\frac{1}{n} \cdot \frac{n-1}{n} = \frac{2(n-1)}{n^2} $

故,黑球纹丝不动的概率为 \(s = 1 - m\)

黑球移动到某一个位置的概率为 \(to = \frac{move}{n - 1} = \frac{2}{n^2}\)

转移为:

\[dp_{i,0} = s \cdot dp_{i-1,0} + to \cdot dp_{i-1,1} \\ dp_{i,1} = m \cdot dp_{i-1,0} + (1 - to) \cdot dp_{i-1,1} \]

最后,因为 \(p_1 = dp_{k,0} \ p_2 = p_3 = p_4 = ... = p_n = \frac{dp_{k,1}}{n-1}\)

由期望计算公式

\[E(X) = \sum_{i = 1}^n ip_i \]

本题的答案

\[ans = \sum_{i = 1}^n ip_i = dp_{k,0} + \frac{dp_{k,1}}{n-1}\sum_{i = 2}^{n} i = dp_{k,0} + \frac{(n + 2)(n-1)}{2} \cdot \frac{dp_{k,1}}{n-1} = \frac{(n + 2)dp_{k,1}}{2} + dp_{k,0} \]

AC-code:

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

#define int long long

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

void wt(int x) {
	static int sta[35];
	int f = 1;
	if(x < 0) f = -1,x *= f;
	int top = 0;
	do {
		sta[top++] = x % 10, x /= 10;
	} while (x);
	if(f == -1) putchar('-');
	while (top) putchar(sta[--top] + 48);
}

const int mod = 998244353;

int qpow(int x,int k) {
	int res = 1;
	while(k) {
		if(k & 1) res = (res * x) % mod;
		x = (x * x) % mod;
		k >>= 1;
	}
	return res;
}

int inv(int x) {
	return qpow(x,mod - 2) % mod;
}

int dp[100005][2];

signed main() {

	int n = rd(),k = rd();

	if(n == 1) {
		wt(1);
		return 0;
	}

	dp[0][0] = 1;

	int P = inv(n);
	int P2 = (P * P) % mod;

	int move = ((n-1)<<1) % mod * P2 % mod;
	int stay = (1 - move + mod) % mod,to = (P2<<1) % mod;

	for(int i = 1;i<=k;i++) {
		dp[i][0] = (dp[i-1][0] * stay % mod + dp[i-1][1] * to % mod) % mod;
		dp[i][1] = (dp[i-1][0] * move % mod + dp[i-1][1] * ((1- to + mod) % mod) %mod) % mod;
	}
	
	int ans = dp[k][0] + ((n + 2) * (n - 1) / 2) % mod * dp[k][1] % mod * inv(n-1) % mod;

	wt(ans % mod);

	return 0;
}

标签:总结,ch,frac,记录,int,2024.7,cdot,黑球,dp
From: https://www.cnblogs.com/WG-MingJunYi/p/18278649

相关文章

  • 超详细的 C++中的封装继承和多态的知识总结<1.封装>
    引言  小伙伴们都知道C++面向对象难,可是大家都知道,这个才是C++和C的真正区别的地方,也是C++深受所有大厂喜爱的原因,它的原理更接近底层,它的逻辑更好,但是学习难度高,大家一定要坚持下来呀,本章呢对于C++有关的知识开始讲解封装继承和多态。好了啦废话不多说,跟着小杨一起开始......
  • 【建议收藏】Go语言关键知识点总结
    容器数组和切片在Go语言中,数组和切片是两个基本的数据结构,用于存储和操作一组元素。它们有一些相似之处,但也有许多不同之处。下面我们详细介绍数组和切片的特点、用法以及它们之间的区别。数组数组是固定长度的序列,存储相同类型的元素。数组的长度在定义时就固定下来,不......
  • 本科第一年总结
    本科第一年终于结束了!这一年里:取得了良好的学业成绩,跳级升入大三。和Ronald,Sraavan一道参加了ICPC区域赛,Codeforces重新打上了CandidateMaster。从去年暑假起,减重30斤,减肥快成功了!结识了志同道合的好朋友。在维多利亚度过了一个美好的寒假。与Amelie和Nei......
  • 【一步一步了解Java系列】:对这个系列的总结以及对缺漏内部类知识的补充
    看到这句话的时候证明:此刻你我都在努力加油陌生人br/>个人主页:GuGuStudy专栏:一步一步了解Java喜欢的一句话:常常会回顾努力的自己,所以要为自己的努力留下足迹喜欢的话可以点个赞谢谢了。作者:小闭一路来的文章第一篇文章:记得这个系列是我今年4月29日开始写的,写......
  • 2024.7.1 之后的做题小记
    7.1P7124[Ynoi2008]stcm维护一个\(O(n\logn)\)级别的子树补不删除莫队。Solution1:考虑菊花图,忽略根节点,一个显然的做法是把这些节点扔进线段树,然后遍历某个节点时候就把它的兄弟节点内所有点加进来。这个做法是线段树所有节点大小和即\(O(n\logn)\)。然后在一条链上......
  • NRF52840DK PCA10056 BLE Mesh Light例程记录
    1.创建项目在打开的VSCode窗口,打开nRFConnect选项卡,"Createanewapplication" 选择"Copyasample" 输入"light", 选择"BluetoothMeshlight". 选择copy后,保存的路径。 键盘"Enter"一下。 点击"AddBuildConfiguration&qu......
  • 工创赛总结与改进
    概述记录一下我们biubiu小队参加2023年中国大学生工程实践与创新能力大赛“智能+物流搬运”赛项的过程,然后对比赛中发生的问题做个记录和总结,并传递一下我们对这个赛项的经验与坑,主要包括:历程分享——我们的参赛经历,过程艰辛,跌宕起伏,几经反转;比赛解读——主要讲一下我们对这......
  • C++知识点总结全系列 (05):IO 类的详细总结和分析
    1、基类istream和ostream(1)istreamA.What输入流的抽象类,是所有输入流类的基类B.Why(输入流的作用)用于从数据源(如文件、标准输入设备等)读取数据(2)ostreamA.What输出流的抽象类,是所有输出流类的基类B.Why(输出流的作用)输出流用于将数据写入到目标位置,例如......
  • 用不同的方法输出时间记录器的时、分、秒,注意对象指针的使用方法
            对象有地址,存放对象的起始地址的指针变量就是指向对象的指针变量。对象中的成员也有地址,存放对象成员地址的指针变量就是指向对象成员的指针变量。        1.指向对象数据成员的指针        定义指向对象数据成员的指针变量的方法和定义指向......
  • 猫头虎 2024年上半年个人总结:科技自媒体的进击与突破
    猫头虎......