[HZOI 2016]我们爱数数
[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]我们爱数数的更多相关文章
- 「LOJ6482」LJJ爱数数
「LOJ6482」LJJ爱数数 解题思路 : 打表发现两个数 \(a, b\) 合法的充要条件是(我不管,我就是打表过的): \[ a + b = \text{gcd}(a, b)^2 \] 设 \( ...
- P4844 LJJ爱数数
题目 P4844 LJJ爱数数 本想找到莫比乌斯反演水题练练,结果直接用了两个多小时才做完 做法 \(\sum\limits_{a=1}^n\sum\limits_{b=1}^n\sum\limits ...
- 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 ...
- 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} ...
- COGS 2416.[HZOI 2016]公路修建 & COGS 2419.[HZOI 2016]公路修建2 题解
大意: [HZOI 2016]公路修建 给定一个有n个点和m-1组边的无向连通图,其中每组边都包含一条一级边和一条二级边(连接的顶点相同),同一组边中的一级边权值一定大于等于二级边,另外给出一个数k( ...
- [补档][HZOI 2016]简单的Treap
[HZOI 2016]简单的Treap 题目 Treap是一种平衡二叉搜索树,除二叉搜索树的基本性质外,Treap还满足一个性质: 每个节点都有一个确定的优先级,且每个节点的优先级都比它的两个儿子小( ...
- [COGS2426][HZOI 2016]几何
[COGS2426][HZOI 2016]几何 题目大意: 给定平面坐标系内\(n\)个整点,求这些整点能构成的正多边形的边数的最大值. 思路: 一个基本结论:平面直角坐标系内能够形成的正多边形一定是 ...
- cogs——2419. [HZOI 2016]公路修建2
2419. [HZOI 2016]公路修建2 ★☆ 输入文件:hzoi_road2.in 输出文件:hzoi_road2.out 简单对比时间限制:1 s 内存限制:128 MB [题 ...
- cogs——2416. [HZOI 2016]公路修建
2416. [HZOI 2016]公路修建 ★☆ 输入文件:hzoi_road.in 输出文件:hzoi_road.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述 ...
随机推荐
- 漫谈JWT
一.JWT简介[对于了解JWT的童鞋,可以直接跳到最后] 咱们就不弄那些乱七八糟的概念,就简单点说一下JWT是什么.有什么和能干什么 1. JWT概念和作用 JWT全称为json web token, ...
- C语言实现栈(顺序存储方式)
#include <stdio.h> #include <stdlib.h> //提供malloc()原型 #include <stdbool.h> //提供tru ...
- 蓝色的cms网站后台管理模板——后台
链接:http://pan.baidu.com/s/1c138cwC 密码:9vy9
- MYSQL的隐式类型转换
官方文档中是这么说的 当操作者使用不同类型的操作数,操作数类型兼容的出现使 转换.一些 发生隐式转换.例如,MySQL会自动 将数字转换为字符串的必要,反之亦然. 也可以将数字转换为字符串明确 使用( ...
- wifi钓鱼 强势拿你的wifi密码
钓鱼wifi 首先设一个场景!!! 如何得到一个免费的wifi 有人可能做过抓包跑包的方法或者跑pin码的方法然而这些方法可能会耗去你大量的时间(我曾经跑包花了一天的时间 跑pin码花了一晚上)感 ...
- 64_p3
perl-Locale-Msgfmt-0.15-17.fc26.noarch.rpm 12-Feb-2017 03:11 20558 perl-Locale-PO-0.27-6.fc26.noarch ...
- 在shell中如何判断字符串是否为有效的IP地址【转】
转自 在shell中如何判断字符串是否为有效的IP地址_echoisecho_新浪博客http://blog.sina.com.cn/s/blog_53a844e50100xxus.html 近来需要 ...
- Tutorial 3: Class-based Views
转载自:http://www.django-rest-framework.org/tutorial/3-class-based-views/ Tutorial 3: Class-based Views ...
- acm专题---拓扑排序+优先队列
struct node{ int id; int cnt; node(int _id,int _cnt):id(_id),cnt(_cnt){} bool operator<(node a) c ...
- strcpy、memcpy和memset之间的区别
今天刷题时遇到了这个问题,记录一下. strcpy比较简单,就是拷贝字符串,遇到'\0'时结束拷贝. memcpy用来做内存拷贝,可以拷贝任何数据类型的对象并指定拷贝数据的长度:char a[100] ...