\(luoguP3330\) [ZJOI2011] 看电影

废了老命想题解

$$luogu$$

$$HZOI$$

题意

到了难得的假期,小白班上组织大家去看电影。但由于假期里看电影的人太多,很难做到让全班看上同一场电影。最后大家在一个偏僻的小胡同里找到了一家电影院,但这家电影院分配座位的方式很特殊,具体方式如下:

电影院的座位共有 \(K\) 个,并被标号为 \(1 \sim K\)。每个人买完票后会被随机指定一个座位,具体来说是从 \(1 \sim K\) 中等概率随机选取一个正整数,设其为 \(L\)。

如果编号 \(L\) 的座位是空位,则这个座位就分配给此人,否则将 \(L\) 加一,继续前面的步骤;如果不存在编号 \(L\) 的座位,则该人只能站着看电影,即所谓的站票。

小白班上共有 \(N\) 人(包括小白自己),作为数学爱好者,小白想知道全班都能够有座位的概率是多少。

提示

对于 \(100 \%\) 的数据,\(1 \leq T \leq 50\),\(1 \leq N,K \leq 200\)。

本题输出的数据可能较大。

样例输入

3
1 1
2 1
2 2

样例输出

1 1
0 1
3 4

题解

假解 ( 正解往下看 )

其实刚开始我没注意样例,并天真的以为每一种不同的选择方式是因为最后的得数不同。

然后得到了一个 nb 的式子 :

\[\frac{C^n_k}{C^n_k+n-1}
\]

并打了一个高精 \(GCD\) 总计 \(270\) 多行,并自信的测了一发样例——

\(\color{red}{WA}\) 了。

重新考虑了一下,模拟了第三组样例:

选取方式如下:( 在第 \(i\) 个位置的数表示坐在第 \(k_i\) 个位置上 , 标红则表示其不合法)

\(1 , 1\) || \(1 , 2\) || \(2 , 1\) || \(\color{red}{2,2}\)

所以 \(P(3) = \frac{3}{4}。\)

现在来考虑正解。

正解

如果 \(n > k\) 直接输出 0 1 注:一定要是这个,输出 0 k^n abcdef \(G\) ┏┛墓┗┓...(((m-__-)m))

现在考虑总选数,显然为 \(k^n\) .

每个人有 \(k\) 种选法, \(n\) 个人,乘法原理得到答案。

考虑合法解。

那我们考虑什么情况下他不合法,就是说你的这个位置往后(包括这个位置)全是有人的。

我们开 \(k + 1\) 个椅子并排成一个环,每个人坐下形成合法的的数目 (注意: \(\bf{不考虑编号}\) )

这个不考虑编号的意思是:

若 \(3\) 个椅子两个人坐,则:

\[(1,2) , (2,3) , (3,1)
\]

均属于同一种情况。

显然答案为

\[(k + 1)^{ n - 1 }
\]

那你现在已经坐好后,我们考虑空的位置。

对于我们现在给到的所有排列肯定都会有满足的情况吧 ( 显然 )

那么在每一个空着的座位,将他之前的一个位置看为 \(n\) (尾) , 将他之后的一位看做 \(1\) 则意味着不会有人坐不下了 (因为末尾之后是空的啊)

我们再考虑对于一种排列方法来说,现在 \(n\) 个人坐着,显然有 \(k + 1 - n\) 个空着的位置。

所以每一种排列的合法方案数为 $k - 1 + n $ , 所以总合法方案数为 \((k + 1 - n) ^ { n - 1 } \times ( k - n + 1 )\)

所以最后答案为:

\[\frac{(k + 1 - n) ^ { n - 1 } \times ( k - n + 1 )}{k^n}
\]

考虑代码实现

我们很显然得到 \((k + 1) ^ {n - 1}\) 与 \(k^n\) 是互素的那我们约分时只考虑 $ k + 1 - n $ 与 \(k^n\) 就可以了。

我们用高精模求出 $k^n \bmod ( k + 1 - n ) $ 求出此数与 \(k + 1 - n\) 的 \(GCD\) ,上下约掉即可

\(code\)

点击查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std ;
const int N = 1e6 + 10 ;
const int binary = 1e9 ;
int gcd(int a, int b) {
if (b == 0)
return a ; return gcd(b, a % b) ;
}
int lena, lenb ;
int T, n, K ;
int a[N], b[N] ;
int beta[N], lenbeta ;
inline void print(int alpha[], int len1) {
cout << alpha[len1] ; for (int i = len1 - 1 ; i >= 1 ; -- i) {
printf("%09lld", alpha[i]) ;
}
}
inline void High_Precision_times(int alpha[], int &len1, int k) {
int j ;
int carry = 0 ; for (j = 1 ; j <= len1 || carry ; ++ j) {
alpha[j] = alpha[j] * k + carry ;
carry = alpha[j] / binary ;
alpha[j] %= binary ;
} while (alpha[j] == 0 && j > 1)
j -- ; len1 = j ;
}
inline void High_Precision_div(int alpha[], int &len1, int k) {
int carry = 0 ; for (int j = len1 ; j >= 1 ; -- j) {
int div = carry * binary + alpha[j] ;
carry = div % k ;
alpha[j] = div / k ;
} while (alpha[len1] == 0 && len1 > 1)
len1 -- ;
}
inline int read() {
int x = 0, f = 1 ;
char c = getchar() ; while (c < '0' || c > '9') {
c = getchar() ;
} while (c >= '0' && c <= '9') {
x = x * 10 + c - '0' ;
c = getchar() ;
} return x * f ;
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("1.in", "r", stdin) ;
freopen("1.out", "w", stdout) ;
#endif
T = read() ; while (T --) {
n = read() ;
K = read() ;
memset(a, 0, sizeof(a)) ;
memset(b, 0, sizeof(b)) ; for (int i = 1 ; i <= lenbeta ; ++ i)
beta[i] = 0 ; lenbeta = 0 ;
lena = lenb = 1 ;
a[1] = 1 ;
b[1] = 1 ; for (int i = 1 ; i <= n - 1 ; ++ i)
High_Precision_times(a, lena, K + 1) ; for (int i = 1 ; i <= n ; ++ i)
High_Precision_times(b, lenb, K) ; for (int i = 1 ; i <= lenb ; ++ i)
beta[i] = b[i] ; lenbeta = lenb ;
High_Precision_times(a, lena, K - n + 1) ; if (n > K) {
cout << 0 << ' ' ;
cout << 1 ;
cout << '\n' ;
continue ;
} int j ;
int bemod = K - n + 1, carry = 0 ; for (j = lenb ; j >= 1 ; -- j) {
int div = carry * binary + beta[j] ;
carry = div % bemod ;
beta[j] = div / bemod ;
} int d = gcd(carry, K - n + 1) ;
High_Precision_div(a, lena, d) ;
High_Precision_div(b, lenb, d) ;
print(a, lena) ;
cout << ' ' ;
print(b, lenb) ;
cout << '\n' ;
}
}

luoguP3330 [ZJOI2011] 看电影--组合数学--高精度的更多相关文章

  1. [ZJOI2011]看电影(组合数学,高精度)

    [ZJOI2011]看电影 这题模型转化很巧妙.(神仙题) 对于这种题首先肯定知道答案就是合法方案除以总方案. 总方案显然是\(k^n\). 那么考虑怎么算合法方案. 当\(n>k\)的时候显然 ...

  2. [ZJOI2011]看电影(组合数学/打表+高精)

    Description 到了难得的假期,小白班上组织大家去看电影.但由于假期里看电影的人太多,很难做到让全班看上同一场电影,最后大家在一个偏僻的小胡同里找到了一家电影院.但这家电影院分配座位的方式很特 ...

  3. 【BZOJ2227】[ZJOI2011]看电影(组合数学,高精度)

    [BZOJ2227][ZJOI2011]看电影(组合数学,高精度) 题面 BZOJ 洛谷 题解 这题太神仙了. 首先\(K<N\)则必定无解,直接特判解决. 现在只考虑\(K\ge N\)的情况 ...

  4. [ZJOI2011]看电影(MOVIE)

    题目描述 到了难得的假期,小白班上组织大家去看电影.但由于假期里看电影的人太多,很难做到让全班看上同一场电影,最后大家在一个偏僻的小胡同里找到了一家电影院.但这家电影院分配座位的方式很特殊,具体方式如 ...

  5. Zjoi2011 看电影

    最近在学习一些概率的东西.. 一个随机试验称为 Laplace 试验,当且仅当它满足如下两个条件: (ⅰ) 试验结果 (样本点) 的个数是有限的.(Ω 是有限集) (ⅱ) 任意两个基本事件的概率均相等 ...

  6. BZOJ2227 [Zjoi2011]看电影(movie)

    Description \(k\)个座位,\(n\)个人依次过来,每人随机从\(k\)个座位中选择一个,并从它开始不停向后走直到遇到空座位坐下.求所有人都能坐下的概率(即没有人走到第\(k+1\)个位 ...

  7. Zjoi2011看电影(movie)

    第一步,打表找规律,发现自己的表连3的小样例都过不去,还不如自己手模,自己手跑了5以下的样例,然后发现毫无规律可言…… 第二步,想出一种错误做法,首先n>k必零,人比座都多……然后粘一下图: 基 ...

  8. 【BZOJ2227】【ZJOI2011】看电影 [组合数][质因数分解]

    看电影 Time Limit: 10 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 到了难得的假期,小白班上组织大家去看 ...

  9. HDU 3496 Watch The Movie(看电影)

    HDU 3496 Watch The Movie(看电影) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] New sem ...

  10. 开始ubuntu 14.04 的装X模式---终端模式下中文输入,听歌,上irc 开启framebuffer看电影 截图

    先上图吧 卡卡的全是在tty1 下的操作,看电影,听歌,截图 ,看图  ,上irc 等等,相当适合在小白面前装屁! 需要安装的软件: 为了能正常显示中文:安装fbterm sudo apt-get i ...

随机推荐

  1. 关于ZYNQ-7000中断调试一点感想

    背景 在ZYNQ 平台下,需要对各种需要的底层接口进行初始化. 我依次调试了很多驱动,从最简单的网口到USB:再到读写PL端的寄存器(通过AXI总线,内存映射读写物理地址实现),到中断的时候一直卡着不 ...

  2. 国产自主架构!龙芯2K1000LA工业核心板正式发布!

    国产自主架构!龙芯2K1000LA工业核心板正式发布! 原创 Tronlong创龙科技 Tronlong创龙科技 2024-06-13 07:50 广东 Tronlong创龙科技 ,赞18 (点击视频 ...

  3. P3731 题解

    简要题意是找到一条边连接使得最大团大小增加. 在补图上最大团等于最大独立集. 所以问题转化为删掉一条边使得最大独立集增加,又因为团不超过两个,所以原图是二分图,也就是使得最大匹配减少. 考虑什么样的匹 ...

  4. 3.3 Y86-64的顺序实现

    将处理组织成阶段 为了实现流水线处理机制,要将指令组织成某个特殊的阶段序列,所有的指令遵循统一的序列,不同阶段放在不同硬件上进行处理.下面是对各阶段的简述. 取指(fetch):取指阶段从内存读取指令 ...

  5. redis雪崩

    每个key(即数据)如果设置了失效时间的话,如果大量key同时过期的时候,或者说因为某种原因redis中的数据突然大批量丢失,这些key又大量地去请求这些key时,因为redis里面没有这些数据,就会 ...

  6. [oeasy]python0141_自制模块_module_reusability_复用性

    自制包内容 回忆上次内容 上次导入了外部的py文件 import my_module 导入一个自己定义的模块   可以使用my_module中的变量 不能 直接使用 my_module.py文件中的变 ...

  7. 使用 Doxygen 来生成 Box2d 的 API 文档

    对于 Doxygen 以前只听别人说过,而现在使用它也是一个偶然,缘分吧.前两天看 box2d 的官方 sdk 中,发现他有用户手册却没有说明,只是留下了一个 Doxygen 的文件.事情告一段落,然 ...

  8. redis如何实现主从同步

    redis实现主从同步分为两种:全量同步和增量同步:第一次连入集群的slave需要进行全量同步,那些断开后重连的slave需要进行增量同步 每个redis都有自己的replid,他们是master的标 ...

  9. hbuilderx打正式包所需的私钥证书的创建方法

    现在使用uniapp作为底层框架来开发app应用已经成为了很多公司的事实标准,而uniapp的开发工具hbuilderx云打包的时候,需要私钥证书和证书profile文件. 而且还需要将打包好的ipa ...

  10. 【Java】Maven模块化工程SSM整合

    创建数据库一个演示表User CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(64) DEFAULT NU ...