\(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. SpringBoot结合easyexcel处理Excel文件

    文/朱季谦 假如有这样一个需求,每天需要读取以下表头的Excel文件,统计文件里击中黑名单的比例,该文件is_blacklist列的1表示击中了黑名单,0表示未击中黑名单. 基于该需求,可以在定时任务 ...

  2. Redis巡检检查 redis-check-aof

    一.AOF1.AOF  是什么以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,Redis启动之初会读取该文件重新构建数据,换言之,R ...

  3. 【干货】顶级 Java 源码教程项目大汇总!

    大家好,我是鱼皮,今天分享几个 GitHub 上顶级的 Java 源码教程项目. 区别于书籍.文档.视频等形式的教程,这些项目几乎都是由 精简的代码片段 和 Demo 组成的,能够轻松地在本地执行,非 ...

  4. 创建数据库时排序规则utf8_general_ci与utf8_bin的区别

    在MySQL数据库中,字符集(如utf8)定义了字符如何存储,而排序规则(Collation)则定义了字符如何比较.排序和区分大小写.utf8_general_ci和utf8_bin是两种常用的UTF ...

  5. ps -ef | grep xxx 解释

    上述内容为:命令拆解: ps:将某个进程显示出来-A 显示所有程序.-e 此参数的效果和指定"A"参数相同.-f 显示UID,PPIP,C与STIME栏位.grep命令是查找中间的 ...

  6. django 如何查询汇总的求和时避免没有数据导致的错误

    django 如何查询汇总的求和时避免没有数据导致的错误 在 Django 中,如果你希望对某个字段进行求和操作,并在没有数据时返回默认值,可以使用 aggregate 结合 Coalesce 函数. ...

  7. TokenObtainPairSerialize

    TokenObtainPairSerializer是Django REST framework的SimpleJWT库提供的序列化器.它用于对用户凭据(如用户名和密码)进行序列化和验证,并在成功的身份验 ...

  8. [oeasy]python0094_视频游戏_双人网球_pong_atari_mos_6502_雅达利_米洛华

    编码进化 回忆上次内容 上次 我们回顾了 微软之前的 比尔盖茨和保罗艾伦 mits 迎来的 是帮手 还是隐患? intel-8080 遇到了 mos-6502 底层硬件 驱动 游戏行业进化 不光是扑克 ...

  9. C# 泛型单例工厂

    核心代码,线程安全 class SingletonFactory<T> where T : new() { private static T uniqueInstance; private ...

  10. vue小知识:多层数据双向相应之向上派发和向下派发($dispatch和$broadcast)

    注意:这两个实例已经在vue3中弃用啦!!!(所以不详细说了,封装知道怎么用就行了,作为了解) 都是在vue实例配置(main.js) 向上派发:$dispatch 注意,在相应后代组件中使用 thi ...