最后的晚餐(dinner)

链接:

https://www.nowcoder.com/acm/contest/219/B

来源:牛客网

题目描述

\(\tt{**YZ}\)(已被和谐)的食堂实在是太挤辣!所以\(\tt{Apojacsleam}\)现在想邀请他的一些好友去校外吃一顿饭,并在某酒店包下了一桌饭。

当\(\tt{Apojacsleam}\)和他的同学们来到酒店之后,他才发现了这些同学们其实是\(N\)对\(cp\),由于要保护广大单身狗的弱小心灵(\(FF\)!),所以他不想让任意一对情侣相邻。

说明:

  • 酒店的桌子是恰好有\(2N\)个位置的圆桌。
  • 客人恰好是\(N\)对\(cp\),也就是说,圆桌上没有空位。
  • 桌子的每一个位置是一样的,也就是说,如果两种方案可以通过旋转得到,那么这就可以视为相等的。
  • 现在,你需要求出,将任意一对情侣不相邻的方案数。

说明

对于\(20\%\)的数据,\(1\le N\le 5\)

对于\(30\%\)的数据,\(1\le N\le20\)

对于\(50\%\)的数据,\(1\le N\le100\)

对于\(70\%\)的数据,\(1\le N\le 200000\)

对于\(100\%\)的数据,\(1\le N\le 30000000\)


思路:容斥原理

\(f_i\)代表至少\(i\)对情侣坐相邻的方案数。

首先考虑一个小问题,\(n\)个人围成一个可以旋转的环的方案数。

可以固定第一个人,方案数就是\((n-1)!\)

那么\(f_i=fac_{2n-i-1}\times 2^i \times \binom{n}{i}\)

分别代表,捆绑法以后的方案数,情侣内部的方案数和选择情侣的可能性。

答案就是\(\sum_{i=0}^nf_i(-1)^i\)

常数写的不好。。说起来标程写的好厉害,我都没看懂。。


Code:

#include <cstdio>
#define ll long long
const ll mod=1e9+7;
const ll Inv=500000004;
const int N=3e7+10;
ll quickpow(ll d,ll k)
{
ll f=1;
while(k)
{
if(k&1) f=f*d%mod;
d=d*d%mod;
k>>=1;
}
return f;
}
ll fac,tfac=1,ans=0,inv[N],po=1;
int n;
int main()
{
scanf("%d",&n);
if(n==1) return puts("0"),0;
for(ll i=1;i<=n;i++) tfac=tfac*i%mod,po=po*2%mod; fac=tfac*quickpow(n,mod-2)%mod; inv[n]=quickpow(tfac,mod-2); for(ll i=n-1;~i;i--) inv[i]=inv[i+1]*(i+1)%mod; for(ll i=n;~i;i--)
{
(ans+=fac*inv[i]%mod*inv[n-i]%mod*po%mod*(i&1?-1:1))%=mod;
fac=fac*(2*n-i)%mod;
po=po*Inv%mod;
} ans=(ans+mod)%mod;
ans=ans*tfac%mod;
printf("%lld\n",ans);
return 0;
}

2018.10.28

nowcoder OI 周赛 最后的晚餐(dinner) 解题报告的更多相关文章

  1. Nowcoder 练习赛 23 D Where are you 解题报告

    Where are you 链接: https://ac.nowcoder.com/acm/contest/272/D 来源:牛客网 题目描述 小\(p\)和他的朋友约定好去游乐场游玩,但是他们到了游 ...

  2. Moscow Pre-Finals Workshop 2016. Japanese School OI Team Selection. 套题详细解题报告

    写在前面 谨以此篇题解致敬出题人! 真的期盼国内也能多出现一些这样质量的比赛啊.9道题中,没有一道凑数的题目,更没有码农题,任何一题拿出来都是为数不多的好题.可以说是这一年打过的题目质量最棒的五场比赛 ...

  3. 牛客OI周赛4-提高组 B 最后的晚餐(dinner)

    最后的晚餐(dinner) 思路: 容斥 求 ∑(-1)^i * C(n, i) * 2^i * (2n-i-1)! 这道题卡常数 #pragma GCC optimize(2) #pragma GC ...

  4. nowcoder(牛客网)OI测试赛2 解题报告

    qwq听说是一场普及组难度的比赛,所以我就兴高采烈地过来了qwq 然后发现题目确实不难qwq.....但是因为蒟蒻我太蒻了,考的还是很差啦qwq orz那些AK的dalao们qwq 赛后闲来无事,弄一 ...

  5. 牛客OI周赛8-提高组A-用水填坑

    牛客OI周赛8-提高组A-用水填坑 题目 链接: https://ac.nowcoder.com/acm/contest/403/A 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制: ...

  6. 牛客OI周赛9-提高组题目记录

    牛客OI周赛9-提高组题目记录 昨天晚上做了这一套比赛,觉得题目质量挺高,而且有一些非常有趣而且非常清奇的脑回路在里边,于是记录在此. T1: 扫雷 题目链接 设 \(f_i\) 表示扫到第 \(i\ ...

  7. 2018.8.30 nowcoder oi赛制测试1

    2018.8.30 nowcoder oi赛制测试1 普及组难度,发现了一些问题 A 题目大意:求斐波那契数列\(f(k-1)f(k+1)-f(k)^2\),范围极大 打表可得规律 其实是卡西尼恒等式 ...

  8. [NOIP2013 花匠] 新人解题报告

    本来按照老师的要求,我学OI的第一份解题报告应是在寒假完成的关于数据结构的基础题,但由于身体原因当时未能完成,那么就在省选赛前临时写几篇吧…… 题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿 ...

  9. 【九度OJ】题目1445:How Many Tables 解题报告

    [九度OJ]题目1445:How Many Tables 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1445 题目描述: ...

随机推荐

  1. (Python爬虫04)了解通用爬虫和聚焦爬虫,还是理论知识.快速入门可以略过的

    如果现在的你返回N年前去重新学习一门技能,你会咋做? 我会这么干: ...哦,原来这个本事学完可以成为恋爱大神啊, 我要掌握精髓需要这么几个要点一二三四..... 具体的学习步骤是这样的一二三.... ...

  2. Java学习 · 初识 面向对象深入一

    面向对象深入 1.面向对象三大特征 a) 继承 inheritance 子类可以从父类继承属性和方法 子类可以提供自己的属性方法 b) 封装 encapsulation 对外隐藏某些属性和方法 对外公 ...

  3. kubernetes相关

    1.获取client , api-server 加token 或in-cluster方式 2.所有对象均有list update get 等方法 3.对象属性源码追踪,yaml与源码一一对应 4.一些 ...

  4. CryptoZombies学习笔记——Lesson4

    第四课主要介绍payable函数相关. chapter1: payable修饰函数 以太坊允许同时调用函数和eth转账.msg.value显示发送到合约的以太币数,ether是内置整型数.如果函数没有 ...

  5. ZooKeeper server &&client

    写了一个关于zookeepeer应用的简单demo 服务端定时的向zookeeper集群注册,客户端监听zookeeper服务节点变化,一旦变化,立刻响应,更新服务端列表 服务端代码: #includ ...

  6. iOS开发开辟线程总结--NSThread

    1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue ...

  7. 用php实现一个双向队列 如何实现?

    PHP面试题作业 class DuiLie { private $array = array();//声明空数组 public function setFirst($item){ return arr ...

  8. vc6.0批量加注释

    MATLAB批量加注释的方法非常简单明了,加注释是ctrl+R,去注释是ctrl+T 然后在VC中我对一条一条加注释的方法非常烦恼,我想也许会有简单的方法可以批量家注释.果然,先贴代码 '------ ...

  9. google go语言开发

    C:cd C:\Program Files\go\gopath\src\opmsset GOOS=linuxset GOARCH=amd64set CGO_ENABLED=0make.batgo in ...

  10. 调用init方法 两种方式 一个是浏览器方法 一个是 xml中手工配置(load-on-startup)

    调用init方法 两种方式 一个是浏览器方法 一个是 xml中手工配置(load-on-startup)