[HZOI 2016]我们爱数数

题目大意:

一张圆桌,每个位置按顺时针从\(1\)到\(n\)编号。有\(n\)个人,编号从\(1\)到\(n\)。如果编号为\(i\)的人坐到了编号为\(i\)的位置或坐到了与编号为\(i\)的位置相邻的位置,这个人就会感到开心,反之这个人会感到沮丧。求有多少种安排坐位的方法,使所有人都入座,并且使得至少\(k\)个人开心。

思路:

用\(f_{i,j,s}\)表示前\(i\)个人,\(j\)个人开心,目前最后两个位置的状态为\(s\)的方案数。

枚举前两个人的位置,就可以化环为链,直接DP就可以求出\(f\)的值。

用\(g_i\)表示\((n-i)!\sum f_{i,j,s}\),\(g_i=\sum {j\choose i}ans_j\)。故\(ans\)可以通过\(g_i\)推出。

参考题解

源代码:

#include<cstdio>
#include<cctype>
#include<cstring>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
typedef long long int64;
const int N=1001;
const int mod=1e9+7;
int p1[4]={0,0,1,2},p2[4]={0,1,2,3};
int n,m,fac[N],ifac[N],f[N][N][4],g[N];
bool v[N];
void exgcd(const int &a,const int &b,int &x,int &y) {
if(!b) {
x=1,y=0;
return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
inline int inv(const int &x) {
int ret,tmp;
exgcd(x,mod,ret,tmp);
return ((ret%mod)+mod)%mod;
}
inline int C(const int &n,const int &m) {
if(m>n) return 0;
return (int64)fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}
int main() {
n=p1[1]=getint(),m=getint();
for(register int i=fac[0]=1;i<=n;i++) {
fac[i]=(int64)fac[i-1]*i%mod;
}
ifac[n]=inv(fac[n]);
for(register int i=n;i>=1;i--) {
ifac[i-1]=(int64)ifac[i]*i%mod;
}
for(register int i=0;i<4;i++) {
const int &a=p1[i];
v[a]=true;
for(register int j=0;j<4;j++) {
const int &b=p2[j];
if(a&&b&&a==b) continue;
v[b]=true;
memset(f,0,sizeof f);
f[2][(!!a)+(!!b)][(v[3]<<1)|v[2]]=1;
for(register int i=2;i<n;i++) {
for(register int j=0;j<=i;j++) {
for(register int k=0;k<4;k++) {
if(!f[i][j][k]) continue;
(f[i+1][j][k>>1]+=f[i][j][k])%=mod;
(f[i+1][j+1][2+(k>>1)]+=f[i][j][k])%=mod;
if(!(k&1)) (f[i+1][j+1][k>>1]+=f[i][j][k])%=mod;
if(!((k>>1)&1)) (f[i+1][j+1][1]+=f[i][j][k])%=mod;
}
}
}
const int t=((v[1]<<1)+v[n]);
for(register int i=1;i<=n;i++) {
for(register int k=0;k<4;k++) {
if(k&t) continue;
(g[i]+=(int64)f[n][i][k]*fac[n-i]%mod)%=mod;
}
}
v[b]=false;
}
v[a]=false;
}
for(register int i=n;i;i--) {
for(register int j=i+1;j<=n;j++) {
g[i]=((g[i]-(int64)g[j]*C(j,i)%mod)%mod+mod)%mod;
}
}
int ans=0;
for(register int i=m;i<=n;i++) (ans+=g[i])%=mod;
printf("%d\n",ans);
return 0;
}

[HZOI 2016]我们爱数数的更多相关文章

  1. 「LOJ6482」LJJ爱数数

    「LOJ6482」LJJ爱数数 解题思路 : 打表发现两个数 \(a, b\) 合法的充要条件是(我不管,我就是打表过的): \[ a + b = \text{gcd}(a, b)^2 \] 设 \( ...

  2. P4844 LJJ爱数数

    题目 P4844 LJJ爱数数 本想找到莫比乌斯反演水题练练,结果直接用了两个多小时才做完 做法 \(\sum\limits_{a=1}^n\sum\limits_{b=1}^n\sum\limits ...

  3. P4844 LJJ爱数数 数论

    思路: 化简后得到(a+b)c=ab,设g=(a,b),A=a/g,B=b/g,则g(A+B)c=ABg^2,即(A+B)c=ABg 由题目已知条件:(a,b,c)=1,即(g,c)=1,g|(A+B ...

  4. LJJ爱数数

    LJJ爱数数 求\(\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\epsilon(gcd(i,j,k))(\frac{1}{i}+\frac{1}{j}==\frac{1} ...

  5. COGS 2416.[HZOI 2016]公路修建 & COGS 2419.[HZOI 2016]公路修建2 题解

    大意: [HZOI 2016]公路修建 给定一个有n个点和m-1组边的无向连通图,其中每组边都包含一条一级边和一条二级边(连接的顶点相同),同一组边中的一级边权值一定大于等于二级边,另外给出一个数k( ...

  6. [补档][HZOI 2016]简单的Treap

    [HZOI 2016]简单的Treap 题目 Treap是一种平衡二叉搜索树,除二叉搜索树的基本性质外,Treap还满足一个性质: 每个节点都有一个确定的优先级,且每个节点的优先级都比它的两个儿子小( ...

  7. [COGS2426][HZOI 2016]几何

    [COGS2426][HZOI 2016]几何 题目大意: 给定平面坐标系内\(n\)个整点,求这些整点能构成的正多边形的边数的最大值. 思路: 一个基本结论:平面直角坐标系内能够形成的正多边形一定是 ...

  8. cogs——2419. [HZOI 2016]公路修建2

    2419. [HZOI 2016]公路修建2 ★☆   输入文件:hzoi_road2.in   输出文件:hzoi_road2.out   简单对比时间限制:1 s   内存限制:128 MB [题 ...

  9. cogs——2416. [HZOI 2016]公路修建

    2416. [HZOI 2016]公路修建 ★☆   输入文件:hzoi_road.in   输出文件:hzoi_road.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述 ...

随机推荐

  1. Unity 添加鼠标右键事件

    把此类放到 Editor下使用就OK using UnityEngine; using System.Collections; using System.Collections.Generic; us ...

  2. notepad++突然崩溃,保存的文件没了怎么办

    在C:\Users\你当前用户的用户名\AppData\Roaming\Notepad++\backup  有备份

  3. 绿色的宠物店cms后台管理系统模板——后台

    链接:http://pan.baidu.com/s/1c7qmsA 密码:2es8

  4. 利用Jsoup模拟跳过登录爬虫获取数据

    今天在学习爬虫的时候想着学习一下利用jsoup模拟登录.下面分为有验证码和无验证码的情况进行讨论. ---------------------------无验证码的情况---------------- ...

  5. ip_rcv && ip_rcv_finish

    (1) 在inet_init中注册了类型为ETH_P_IP协议的数据包的回调ip_rcv (2) 当二层数据包接收完毕,会调用netif_receive_skb根据协议进行向上层分发 (3) 类型为E ...

  6. 继电器是如何成为CPU的(1)【转】

    转自:http://www.cnblogs.com/bitzhuwei/p/from_relay_to_tiny_CPU.html 阅读目录(Content) 从电池.开关和继电器开始 用继电器做个与 ...

  7. Workqueue机制的实现

    Workqueue机制中定义了两个重要的数据结构,分析如下: cpu_workqueue_struct结构.该结构将CPU和内核线程进行了绑定.在创建workqueue的过程中,Linux根据当前系统 ...

  8. vsftpd.conf 详解

    //不允许匿名访问 anonymous_enable=NO //设定本地用户可以访问.注意:主要是为虚拟宿主用户,如果该项目设定为NO那么所有虚拟用户将无法访问 local_enable=YES // ...

  9. DHCP简单配置

    DHCP是什么? DHCP动态主机地址管理协议(Dynamic Host Configuration Protocol)是一种基于UDP协议且仅限用于局域网内使用的网络协议,最主要的用途是为局域网内部 ...

  10. Java学习(构造方法、this关键字、super应用)

    构 造 方 法 定义:对象创建时使用的方法,即在new一个新对象时,对应构造方法,直接对属性赋值. 语句格式:    修饰符(public 等) 构造方法名(必须跟当前类名一样,否则报错)(参数列表) ...