题解-骰子

题目

Description

桌面上有 \(2\) 只完全相同的骰子,定义一次操作如下:将桌子上的骰子全部抛出,然后去掉那些奇数点的骰子,如果桌子上还有骰子,则重复上面的操作。
求操作 \(n\) 次后,桌面上至少还有一个骰子的概率。
为了方便起见,你只需要输出概率对 \(19260817\) 取模的结果。

Input

\(1\)\(1\) 个整数 \(n\)
保证 \(n\)long long范围内

Output

\(1\)\(1\) 个结果 对 \(19260817\) 取模的结果

Sample Input

1

Sample Output

4815205

HINT

对于 \(40\%\) 的数据 : \(1 \le nnn \le 1000000\)
对于 \(100\%\) 的数据 : \(n\)long long范围内

题解

说点题外话:这两个字读骰子(tóu zǐ)

容易看出,解此题分两部分:

  • 把概率对应的分数算出来
  • 把分数取模

关于分数取模

\(\frac{a}{b} \mod p\)就是 \(a \times b\texttt{关于}p\texttt{的乘法逆元}\)

\[a \times b^{-1}(\operatorname{mod}p) \]

核心在于求解\(b\)关于\(p\)的乘法逆元。

即求解

\[ax\equiv 1(\operatorname{mod} p) \]

概率

题目求桌面上至少还有一个骰子的概率,所以就是剩一个骰子和剩两个骰子的概率。

每个骰子的奇数和偶数的概率相等,都是\(\frac{1}{2}\)

每次操作后,\(2\)个骰子都留下和都去掉的概率都是\(\frac{1}{4}\)

\(2\)个骰子到\(1\)个的概率是\(\frac{1}{2}\)

当只剩\(1\)个骰子时,剩下和去掉的概率均是\(\frac{1}{2}\)
RT:
1ZMLVI.png

定义在第\(n\)次操作后,剩两个、一个、恰好零个的概率分别为\(f_2(n)\)\(f_1(n)\)\(f_0(n)\)

剩两个的概率比较好求:

\[f_2(n)=\frac{1}{4^n} \]

剩一个的概率是由2个到1个的概率加由1个到1个的概率:

\[f_1(n)=\frac{1}{2}\times f_2(n-1)+\frac{1}{2}\times f_1(n-1) \]

代入\(f_2(n)=\frac{1}{4^n}\),

\[f_1(n)=\frac{1}{2\times 4^{n-1}}+\frac{1}{2}\times f_1(n-1) \]

代入\(f_1(n-1)\)

\[f_1(n)=\frac{1}{2\times 4^{n-1}}+\frac{1}{2}\times(\frac{1}{2\times4^{n-2}}+\frac{1}{2}\times f_1(n-2)) \]

整理得,

\[f_1(n)=\frac{1}{2\times 4^{n-1}}+\frac{1}{4^{n-1}}+\frac{1}{4}\times f_1(n-2) \]

代入\(f_1(n-2)\)

\[f_1(n)=\frac{1}{2\times 4^{n-1}}+\frac{1}{4^{n-1}}+ \frac{1}{4}\times(\frac{1}{2\times 4^{n-3}} + \frac{1}{2}\times f_1(n-4)) \]

整理得,

\[f_1(n)=\frac{1}{2\times 4^{n-1}}+\frac{1}{4^{n-1}}+ \frac{1}{2\times4^{n-2}} +\frac{1}{8}\times f_1(n-4) \]

到这里,已经容易看出:(每次分母除2,求和)

\[f_1(n)=\frac{1}{2\times 4^{n-1}}+\frac{1}{4^{n-1}}+ \frac{1}{2\times4^{n-2}}+\cdots+f_1(0) \]

另有,

\[f_1(0)=0 \]

容易得出,

\[f_1(n)=\sum_{k=0}^{n-1} \frac{2^k}{2\times4^{n-1}} \]

其实就是首项为\(\frac{2^{n-1}}{2\times 4^{n-1}}=\frac{1}{2^n}\)末项为\(\frac{1}{2\times4^{n-1}}\)等比数列

所以其和就是,

\[f_1(n)=\frac{1}{2^{n-1}}-\frac{1}{2\times 4^{n-1}} \]

答案就是,

\[\begin{align} Ans&=f_1(n)+f_2(n)\\ &=\frac{1}{2^{n-1}}-\frac{1}{2\times 4^{n-1}}+\frac{1}{4^n} \\ &=\frac{2^{n+1}-1}{4^n} \end{align} \]

Code

附上本蒟蒻929B代码:

#include <cstdio>
#include <algorithm>

#define MOD 19260817
using namespace std;

long long fast_pow(long long a, long long b) {
	if (b == 0) return 1;
	if (b == 1) return a;
	long long half_result = fast_pow(a, b / 2);
	if (b % 2 == 0) return half_result * half_result % MOD;
	else return (((half_result * half_result) % MOD) * a) % MOD;
}

long long exgcd(long long a, long long b, long long &x, long long &y) {
	if (b == 0) {
		x = 1;
		y = 0;
		return a;
	}

	long long result = exgcd(b, a % b, x, y);
	long long t = x;
	x = y;
	y = t - (a / b) * y;
	return result;
}

int main() {
	long long n;
	scanf("%lld", &n);
	long long a = fast_pow(2, n + 1) - 1;
	a %= MOD;
	if (a < 0) a += MOD;

	long long b = fast_pow(4, n);
	long long x, y;
	long long g = exgcd(b, MOD, x, y);
	if (g != 1) printf("qwq");
	while (x < 0) x += MOD;
	x *= a;
	x %= MOD;
	printf("%lld\n", x);
	return 0;
}
posted @ 2020-01-24 17:45  方而静  阅读(268)  评论(0)    收藏  举报