第一步,打表找规律,发现自己的表连3的小样例都过不去,还不如自己手模,自己手跑了5以下的样例,然后发现毫无规律可言……

第二步,想出一种错误做法,首先n>k必零,人比座都多……然后粘一下图:

基本思想单步容斥,1除去不可行的,后面那一坨求和是用实际意义想的,前i个人恰好从k个位置中,把最后i个给选掉了(包括移动的过程),然后剩下的n-i个人从k个座位中选中前k-i个则不会牺牲,否则GG,还是单步容斥,1除去不死的情况就是牺牲的。

然后化简,把分母化成n!*n^k这种常数,算分子求和,然后是小点,k<=3的,都过了,特别兴奋,准备上高精,结果试了一个3,5,心里一下就凉了,仔细思考一下,发现确实算重了,画了个3,4,发现有的位置由于那个Combine算重了,再改就多步容斥了。

而且这种题输出分数,又是高精,肯定不会是上式那种变态的形式。

第三步,重新打表,发现与(k+1)关系匪浅(因为k=9那一列全是10的倍数……),规律有了。

下面给出正解:

思路有些反人类,我们都是做环题拆环(即环排列),这题需要我们建环,首先在n<=k的前提下,我们再插入第k+1把椅子,是所有椅子构成一个环,这样想一下,就不可能有人没座了(因为会转圈,而人数小于椅子数,肯定人人有座),所以情况数为(k+1)^n,然后根据换排列的知识,肯定有重复情况(即将圆旋转可以得到同一个圆),当然此时你也可以用拆环的思想(刚建完就拆,Orz),不过一般都是除以元素总数,即k+1,现在就是(k+1)^(n-1),可是我们比原题多了一把椅子,怎么办呢?从剩下的k+1-n把空椅子中抽一把就好了……这样的话就是符合题意的条件,大家可以自己把式子写下来再想想。

总方案k^n没什么问题,那答案就是(k+1)^(n-1)*(k+1-n)/(k^n)喽。

然后向别人询问了高精gcd……其实用不到,做这种分数题小的求gcd,大的直接唯一分解定理拆,具体实现看看代码吧,不太好说,大概就是把分子拆到一个数组里,把分母拆到一个数组里,比较一下,那个数量多就乘到谁身上,高精还是要自己打的好。

ps:一开始以为会因为玄学高精卡时间,结果自家oj跑的还挺快,就没亿进制优化,想打的自己尝试一下吧。

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<vector>
  7. #include<queue>
  8. #include<stack>
  9. using namespace std;
  10. struct Bint{
  11. int a[];
  12. int len;
  13. void clear(){
  14. memset(a,,sizeof(a));
  15. len=;
  16. a[]=;
  17. }
  18. friend void operator *(Bint &x,int y){
  19. int res=;
  20. for(int i=;i<=x.len;i++){
  21. x.a[i]=x.a[i]*y+res;
  22. res=x.a[i]/;
  23. x.a[i]%=;
  24. }
  25. while(res){
  26. x.a[++x.len]=res%;
  27. res/=;
  28. }
  29. while(x.a[x.len]==&&x.len>) x.len--;
  30. }
  31. void print(){
  32. for(int i=len;i>=;i--)
  33. printf("%d",a[i]);
  34. }
  35. }afz,afm;
  36. int a[],fz[],fm[],n,k,T;
  37. int p[];
  38. bool judge(int x){
  39. for(int i=;i<=sqrt(x);i++)
  40. if(x%i==) return ;
  41. return ;
  42. }
  43. void doprime(){
  44. for(int i=;i<=;i++)
  45. if(judge(i)) p[++p[]]=i;
  46. }
  47. void multfz(int x){
  48. for(int i=;i<=p[];i++)
  49. while(x%p[i]==) {
  50. fz[i]++;
  51. x/=p[i];
  52. }
  53. }
  54. void multfm(int x){
  55. for(int i=;i<=p[];i++)
  56. while(x%p[i]==){
  57. fm[i]++;
  58. x/=p[i];
  59. }
  60. }
  61. void work(){
  62. for(int i=;i<=p[];i++){
  63. if(fz[i]>fm[i])
  64. for(int j=;j<=fz[i]-fm[i];j++)
  65. afz*p[i];
  66. else if(fz[i]==fm[i]) continue;
  67. else
  68. for(int j=;j<=fm[i]-fz[i];j++)
  69. afm*p[i];
  70. }
  71. afz.print();
  72. putchar(' ');
  73. afm.print();
  74. putchar('\n');
  75. }
  76. int main(){
  77. doprime();
  78. scanf("%d",&T);
  79. while(T--){
  80. scanf("%d%d",&n,&k);
  81. memset(fz,,sizeof(fz));
  82. memset(fm,,sizeof(fm));
  83. afz.clear();afm.clear();
  84. if(n>k){puts("0 1");continue;}
  85. for(int i=;i<n;i++)
  86. multfz(k+);
  87. multfz(k+-n);
  88. for(int i=;i<=n;i++)
  89. multfm(k);
  90. /* for(int i=1;i<=p[0];i++)
  91. cout<<fz[i]<<" ";cout<<endl;
  92. for(int i=1;i<=p[0];i++)
  93. cout<<fm[i]<<" ";cout<<endl;*/
  94. work();
  95. }return ;
  96. }

Zjoi2011看电影(movie)的更多相关文章

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

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

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

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

  3. [ZJOI2011]看电影(MOVIE)

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

  4. Zjoi2011 看电影

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. SQL SERVER中Datetime时间的范围与.net的DateTime对象的区别

    对于编写.net程序中我们一般写默认的时间,我们会自动创建一个new DateTime()对象.但与SQL SERVER连用我们就会出现一个时间范围的问题. 今天我就记录一下该时间问题. 我们创建的n ...

  2. luogu题解P1032字串变换--BFS+STL:string骚操作

    题目链接 https://www.luogu.org/problemnew/show/P1032 分析 这题本来很裸的一个BFS,发现其中的字符串操作好烦啊.然后就翻大佬题解发现用STL中的strin ...

  3. qq快捷打开聊天窗口的代码

    pc代码: http://wpa.qq.com/msgrd?v=3&uin=8423291&site=qq&menu=yes

  4. ONNX源码安装

    ONNX是facebook提出的一个 Open Neural Network Exchange协议,能够让训练好的模型在不同的框架间进行交互. ONNX的安装相对来说不是特别麻烦,麻烦的是其依赖库的安 ...

  5. powershell查看版本信息

    在终端输入$PSVersionTable

  6. Struts简介

    一.简介 Apache Struts 2最初被称为WebWork 2,它是一个简洁的.可扩展的框架,可用于创建企业级Java web应用程序.设计这个框架是为了从构建.部署.到应用程序维护方面来简化整 ...

  7. Matplotlib 随机漫步图

    import matplotlib.pyplot as plt from random import choice class Randomwalk(): def __init__(self,num_ ...

  8. php 生成mysql数据字典 (php5.5-5.6)

    <?php /** * 生成mysql数据字典 */ //配置数据库 $dbserver = "127.0.0.1"; $dbusername = "root&qu ...

  9. Jmeter:非 GUI 命令行执行脚本文件

    介绍 进行性能测试时,Jmeter 官方文档声明是不建议在 GUI 执行的,此时需要用到命令行. 第一步:环境配置 把 Jmeter安装目录\bin 添加到 系统环境变量path 第二步:命令参数 - ...

  10. 自制centos6开机界面

    1.先准备好一张640x480大小的图片并上传至主机(可在画图工具中调整图片大小) 注意如没有rz命令,可以先安装: yum install lrzsz 2.制作背景图 制作需要用到convert命令 ...