第一步,打表找规律,发现自己的表连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跑的还挺快,就没亿进制优化,想打的自己尝试一下吧。

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
struct Bint{
int a[];
int len;
void clear(){
memset(a,,sizeof(a));
len=;
a[]=;
}
friend void operator *(Bint &x,int y){
int res=;
for(int i=;i<=x.len;i++){
x.a[i]=x.a[i]*y+res;
res=x.a[i]/;
x.a[i]%=;
}
while(res){
x.a[++x.len]=res%;
res/=;
}
while(x.a[x.len]==&&x.len>) x.len--;
}
void print(){
for(int i=len;i>=;i--)
printf("%d",a[i]);
}
}afz,afm;
int a[],fz[],fm[],n,k,T;
int p[];
bool judge(int x){
for(int i=;i<=sqrt(x);i++)
if(x%i==) return ;
return ;
}
void doprime(){
for(int i=;i<=;i++)
if(judge(i)) p[++p[]]=i;
}
void multfz(int x){
for(int i=;i<=p[];i++)
while(x%p[i]==) {
fz[i]++;
x/=p[i];
}
}
void multfm(int x){
for(int i=;i<=p[];i++)
while(x%p[i]==){
fm[i]++;
x/=p[i];
}
}
void work(){
for(int i=;i<=p[];i++){
if(fz[i]>fm[i])
for(int j=;j<=fz[i]-fm[i];j++)
afz*p[i];
else if(fz[i]==fm[i]) continue;
else
for(int j=;j<=fm[i]-fz[i];j++)
afm*p[i];
}
afz.print();
putchar(' ');
afm.print();
putchar('\n');
}
int main(){
doprime();
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&k);
memset(fz,,sizeof(fz));
memset(fm,,sizeof(fm));
afz.clear();afm.clear();
if(n>k){puts("0 1");continue;}
for(int i=;i<n;i++)
multfz(k+);
multfz(k+-n);
for(int i=;i<=n;i++)
multfm(k);
/* for(int i=1;i<=p[0];i++)
cout<<fz[i]<<" ";cout<<endl;
for(int i=1;i<=p[0];i++)
cout<<fm[i]<<" ";cout<<endl;*/
work();
}return ;
}

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. 【原创】大叔经验分享(59)kudu查看table size

    kudu并没有命令可以直接查看每个table占用的空间,可以从cloudera manager上间接查看 CM is scrapping and aggregating the /metrics pa ...

  2. JavaScript中with不推荐使用,为什么总是出现在面试题中?

    with的基本使用 尴尬的with关键字 一.with的基本使用 with是用来扩展语句作用域的,什么意思呢?先来看看语法和示例: 语法: with(expression){ statement } ...

  3. vue-过滤器-时间戳转换

    main.js // 将时间戳转日期格式的过滤器 Vue.filter('dateFormat', (dataStr) => { var time = new Date(dataStr); fu ...

  4. JS和JS是IE上JavaScript或JScript的缩写。

    JS和JS是IE上JavaScript或JScript的缩写.javascript是所有浏览器的开放式标准脚本语言JScript是微软自己的开放式脚本语言标准,只有微软的IE浏览器遵循.JScript ...

  5. vue移动端出现遮罩层时在遮罩层滑动时禁止遮罩层下方页面滑动

    h5页面 点击出现弹框时 在遮罩层上面滑动时 下方的页面会出现滑动现象 解决方法 我知道的有以下两种 在遮罩层标签上添加@touchmove.prevent 把遮罩层显示时把下方的父盒子css设置为固 ...

  6. 阿里云 elasticsearch 增删改查

    kibana 控制台 # 查询所有数据 GET /yixiurds_dev/_search { "query": { "match_all": { } } } ...

  7. maven入门-- part1 简介

    Maven是什么 maven是基于项目对象模型(pom:project object model),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具.对依赖关系的特性进行细致的分析和划 ...

  8. mysql命令行的一些小技巧【实用:多屏显示,格式化输出等】

    1.以html格式输出结果使用mysql客户端的参数–html或者-T,则所有SQL的查询结果会自动生成为html的table代码$ mysql -u root --htmlWelcome to th ...

  9. ActiveMQ基础简介

    1. 什么是ActiveMQ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现 ...

  10. 记一次自启动的docker容器将宿主机的开机用户登录界面覆盖事件

    宿主机的系统为CentOS7_7.7.1908,默认为GUI启动,安装了宝塔面板,docker-ce为最新版. 在启动了一个centos7的容器(镜像为centos官方镜像)后,将该容器重启策略设置为 ...