看电影

Time Limit: 10 Sec  Memory Limit: 259 MB
[Submit][Status][Discuss]

Description

  到了难得的假期,小白班上组织大家去看电影。但由于假期里看电影的人太多,很难做到让全班看上同一场电影,最后大家在一个偏僻的小胡同里找到了一家电影院。但这家电影院分配座位的方式很特殊,具体方式如下: 1. 电影院的座位共有K个,并被标号为1…K,每个人买完票后会被随机指定一个座位,具体来说是从1…K中等可能的随机选取一个正整数,设其为L。 2. 如果编号L的座位是空位,则这个座位就分配给此人,否则将L加一,继续前面的步骤。 3. 如果在第二步中不存在编号L的座位,则该人只能站着看电影,即所谓的站票。小白班上共有N人(包括小白自己),作为数学爱好者,小白想知道全班都能够有座位的概率是多少。

Input

  输入文件第一行有且只有一个正整数T,表示测试数据的组数。 第2~T+1行,每行两个正整数N,K,用单个空格隔开,其含义同题目描述。

Output

  输出文件共包含T行。第i行应包含两个用空格隔开的整数A,B,表示输入文件中的第i组数据的答案为A/B。(注意,这里要求将答案化为既约分数)

Sample Input

  3
  1 1
  2 1
  2 2

Sample Output

  1 1
  0 1
  3 4

HINT

  对于100%的数据 T<=50,N,K<=200

Main idea

  有n个人,k个位置,询问按照以下坐法使得所有人都有位置坐的概率是多少。(坐法:每个人随机一个位置,如果这个位置有人那一直就往后坐,如果后面都有人了则不可行)

Source

  运用组合数学,首先我们知道n个人k个位置的总方案数是k^n,然后我们考虑一下怎么求出可行的方案,发现直接做的话无解与有解的两个情况不好考虑,怎么办呢?

  我们发现可以考虑一下多加一个空位置使其构成一个环,那么这时候每个位置都必定是有解的方案数就是(k+1)^n。再考虑如何删掉重复的情况,由于我们加入了一个位置,那么除去经过这个位置的情况显然是方案数/(k+1),那么现在方案数就是(k+1)^n/(k+1),然后乘上有几个空位置即可。最后答案就是:( (k+1)^n/(k+1)*(k+1-n) ) / (k^n)

  我们发现这个现在求出来的方案数比较大,但是又看见了n,k<=200,想到了数字n的质因数和n^k的质因数是一样的(所以这时候质因数肯定都是200以内的质数),所以我们乘的时候直接质因数分解,然后两个数字的质因数去重,最后用一个高精度乘起来输出即可。

Code

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std; const int ONE=; int T;
int n,k;
int prime[ONE],cnt;
int p[ONE][];
int record,x; struct power
{
int num[],len;
void print()
{
for(int i=len;i>=;i--)
printf("%d",num[i]);
} friend power operator *(power a,power b)
{
power c;
c.len=a.len+b.len;
for(int i=;i<=c.len;i++) c.num[i]=; for(int i=;i<=a.len;i++)
{
x=;
for(int j=;j<=b.len;j++)
{
c.num[i+j-]=c.num[i+j-] + x + a.num[i]*b.num[j];
x=c.num[i+j-]/;
c.num[i+j-]%=;
}
c.num[i+b.len]=x;
} while(c.len> && !c.num[c.len]) c.len--;
return c;
}
}kd[],pass; void dealwith(int x)
{
for(int i=;i<=pass.len;i++) pass.num[i]=;
pass.len=;
while(x)
{
pass.num[++pass.len]=x%;
x/=;
}
} int get()
{
int res=,Q=;char c;
while( (c=getchar())< || c> )
if(c=='-')Q=-;
res=c-;
while( (c=getchar())>= && c<= )
res=res*+c-;
return res*Q;
} int PD(int x)
{
for(int i=;i<x;i++)
if(x%i==) return ;
return ;
} int Chai(int x,int PD)
{
if(x==) return x;
for(int i=;i<=cnt;i++)
{
if(!(x%prime[i]))
{
p[prime[i]][PD]++;
x=Chai(x/prime[i],PD);
break;
}
}
return x;
} int Deal(int x,int m,int PD)
{
record=;
for(int i=;i<=m;i++)
{
record*=x;
record=Chai(record,PD);
} if(PD==)
{
record*=(x-m-);
record=Chai(record,PD);
} p[record][PD]++;
} int main()
{
T=get();
for(int i=;i<=;i++)
if(PD(i)) prime[++cnt]=i; while(T--)
{
n=get(); k=get();
if(n>k)
{
printf("0 1\n");
continue;
} memset(p,,sizeof(p));
Deal(k+,n-,); Deal(k,n,);
for(int i=;i<=;i++)
{
int x=min(p[i][],p[i][]);
p[i][]-=x; p[i][]-=x;
} kd[].len=kd[].len=;
kd[].num[]=kd[].num[]=;
for(int i=;i<=cnt;i++)
{
dealwith(prime[i]);
for(int t=;t<=;t++)
for(int j=;j<=p[prime[i]][t];j++)
kd[t]=kd[t]*pass;
} kd[].print(); printf(" ");
kd[].print(); printf("\n"); }
}

【BZOJ2227】【ZJOI2011】看电影 [组合数][质因数分解]的更多相关文章

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

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

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

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

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

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

  4. [ZJOI2011]看电影(MOVIE)

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

  5. Zjoi2011 看电影

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

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

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

  7. 【Foreign】魔法 [组合数][质因数分解]

    魔法 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 4 10 ...

  8. Zjoi2011看电影(movie)

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

  9. C. Trailing Loves (or L'oeufs?) (质因数分解)

    C. Trailing Loves (or L'oeufs?) 题目传送门 题意: 求n!在b进制下末尾有多少个0? 思路: 类比与5!在10进制下末尾0的个数是看2和5的个数,那么 原题就是看b进行 ...

随机推荐

  1. NOI2018 游记

    day-2 飞向长沙 上午收拾了收拾东西,下载了动画<爱吃拉面的小泉同学>的前五集. 吃过午饭,就准备坐车去运城机场.高铁飞速,转眼间就到了.我没坐过几次飞机,而且比较恐飞,就很难受qwq ...

  2. unity3d 摄像机跟随角色时被物体遮挡解决方案

    参考文章:http://www.xuanyusong.com/archives/1991 在看此文章时请先看上面的参考文章 看完以上文章后,你也许会想人家都已经给出所有代码了,你还写个毛啊 别急,现在 ...

  3. C#调用C++编写的dll

    界面还是C#写的方便点,主要是有一个可视化的编辑器,不想画太多的时间在界面上.但是自己又对C++了解的多一些,所以在需要一个良好的界面的情况下,使用C++来写代码逻辑,将其编译成一个dll,然后用C# ...

  4. 「暑期训练」「Brute Force」 Bitonix' Patrol (CFR134D1D)

    题意 有n" role="presentation">nn个站点,排成圆形,每站间距m" role="presentation"> ...

  5. APP功能性测试-3

    定义:兼容测试就是指软件在特定的硬件平台,不同的应用软件之间,不同的操作系统平台上,不同的网络等环境中是否能够正常的运行的测试  (会不会产生不兼容) 兼容性测试的作用 进一步提高产品质量 和其他软件 ...

  6. JS运行在服务器端注意事项

    <script runat="server" language="javascript"> </script> 1. ASP利于JS重载 ...

  7. Sersync实时备份服务部署实践

  8. [ecmagnet][django] 如何使用django的signal

    """ 在web开发中, 你可能会遇到下面这种场景: 在用户完成某个操作后, 自动去执行一些后续的操作. 譬如用户完成修改密码后,你要发送一份确认邮件 观察者模式:观察者 ...

  9. 望岳物业App开发过程记录

    望岳物业APP开发过程记录 ——杜冰青 1.小组讨论,决定模块功能. 2.开始做“社区活动”界面,完成主页面.分享界面.内容界面,但是分享功能暂时没有完成. 3.接着做“一键开门”界面,因为硬件设施跟 ...

  10. [问题解决]Python locale error: unsupported locale setting

    原文来源:https://stackoverflow.com/questions/14547631/python-locale-error-unsupported-locale-setting 安装f ...