BZOJ

因为是本质不同,所以考虑以最小字典序计数。

假设序列最大值为\(m\),那么序列有这两种情况:

  1. \(1\ (1\ 2\ 1\ 2...)\ 2\ (3\ 2\ 3\ 2...)\ 3\ (4\ 3\ 4\ 3...)\ ...\ m\)
  2. \(1\ (1\ 2\ 1\ 2...)\ 2\ (3\ 2\ 3\ 2...)\ 3\ (4\ 3\ 4\ 3...)\ ...\ m\ m-1\)

如果序列长度为\(n\),那么可以看做我们有\(\frac{n-m}{2}\)个相同的球,将它们放进\(m-1\)个盒子,允许盒子有空的方案数,即\(C_{n+m-1}^{m-1}\)。

这里球的个数取\(\lfloor\frac{n-m}{2}\rfloor\)即可(第二种情况取\(\lfloor\frac{n-m-1}{2}\rfloor\))。如果多出来一个,那把它放到两种序列的后面仍是不同的。

\(n,m\)都是不确定的。因为\(\sum_{i=0}^nC_{i+m-1}^{m-1}=C_{n+m-1}^{m-1}\),所以枚举最大值\(m\),就可以\(O(m)\)得到答案啦。

预处理到\(2e6\)就可以啊,不需要\(4e6\),因为\(\frac{n-m}{2}+m=\frac{n+m}{2}\)。。

//16448kb	1008ms
#include <cstdio>
#include <algorithm>
#define mod 1000000007
typedef long long LL;
const int N=2e6+5; int fac[N],ifac[N]; #define F(n,m) (1ll*fac[(n)+(m)-1]*ifac[n]%mod*ifac[(m)-1]%mod)
inline int FP(int x,int k)
{
int t=1;
for(; k; k>>=1,x=1ll*x*x%mod)
if(k&1) t=1ll*t*x%mod;
return t;
} int main()
{
int n,m; scanf("%d%d",&n,&m);
fac[0]=fac[1]=1; int lim=n+m>>1;
for(int i=2; i<=lim; ++i) fac[i]=1ll*fac[i-1]*i%mod;
ifac[lim]=FP(fac[lim],mod-2);
for(int i=lim-1; ~i; --i) ifac[i]=1ll*ifac[i+1]*(i+1)%mod; LL ans=n&&m;//m=1特判下
for(int i=2,l=std::min(n,m); i<=l; ++i)
{
ans+=F((n-i)/2,i);
if(i+1<=n) ans+=F((n-i-1)/2,i);
}
printf("%lld\n",ans%mod); return 0;
}
// int i;//突然闲的
// for(i=2; i+3<=lim; i+=4)
// fac[i]=1ll*fac[i-1]*i%mod,
// fac[i+1]=1ll*fac[i]*(i+1)%mod,
// fac[i+2]=1ll*fac[i+1]*(i+2)%mod,
// fac[i+3]=1ll*fac[i+2]*(i+3)%mod;
// for(; i<=lim; ++i) fac[i]=1ll*fac[i-1]*i%mod;
// ifac[lim]=FP(fac[lim],mod-2);
// for(i=lim-1; i-3>=0; i-=4)
// ifac[i]=1ll*ifac[i+1]*(i+1)%mod,
// ifac[i-1]=1ll*ifac[i]*(i)%mod,
// ifac[i-2]=1ll*ifac[i-1]*(i-1)%mod,
// ifac[i-3]=1ll*ifac[i-2]*(i-2)%mod;
// for(; i>=0; --i) ifac[i]=1ll*ifac[i+1]*(i+1)%mod;

BZOJ.4402.Claris的剑(组合 计数)的更多相关文章

  1. bzoj 4402 Claris的剑 组合数学

    Claris的剑 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 375  Solved: 213[Submit][Status][Discuss] D ...

  2. BZOJ 3505: [Cqoi2014]数三角形 [组合计数]

    3505: [Cqoi2014]数三角形 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个. 注意三角形的三点不能共线. 1<=m,n<=1000 $n++ m++$ $ans ...

  3. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)

    黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...

  4. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  5. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  6. bzoj 1004 Cards 组合计数

    这道题考察的是组合计数(用Burnside,当然也可以认为是Polya的变形,毕竟Polya是Burnside推导出来的). 这一类问题的本质是计算置换群(A,P)中不动点个数!(所谓不动点,是一个二 ...

  7. 【BZOJ5323】[JXOI2018]游戏(组合计数,线性筛)

    [BZOJ5323][JXOI2018]游戏(组合计数,线性筛) 题面 BZOJ 洛谷 题解 显然要考虑的位置只有那些在\([l,r]\)中不存在任意一个约数的数. 假设这样的数有\(x\)个,那么剩 ...

  8. 【BZOJ5305】[HAOI2018]苹果树(组合计数)

    [BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...

  9. 【BZOJ3142】[HNOI2013]数列(组合计数)

    [BZOJ3142][HNOI2013]数列(组合计数) 题面 BZOJ 洛谷 题解 唯一考虑的就是把一段值给分配给\(k-1\)天,假设这\(k-1\)天分配好了,第\(i\)天是\(a_i\),假 ...

随机推荐

  1. Brup Suite 渗透测试笔记(七)

    继续接上次笔记: 1.Burp Intruder的payload类型的子模块(Character blocks)使用一种给出的输入字符,根据指定的设置产生指定大小的字符块,表现形式为生成指定长度的字符 ...

  2. Nginx详解二十六:Nginx架构篇之性能优化

    一.性能优化考虑点 1.当前系统结构瓶颈 通过压力测试观察指标.日志检测.性能分析 2.了解业务模式 接口业务类型.系统层次化结构 3.性能与安全 二.ab接口压力测试工具 1.安装:yum -y i ...

  3. Python操作MySQL案例

    最近都在学习Python代码,希望学会Python后,能给我带来更高的工作效率,所以每天坚持学习和拷代码,下面是一个Python操作MySQL的一个实例,该实例可以让更多的人更好了解MySQLdb模块 ...

  4. OrCAD Capture CIS 16.6 快速地编辑Part的引脚名称

    操作系统:Windows 10 x64 工具1:OrCAD Capture CIS 16.6-S062 (v16-6-112FF) 工具2:Excel 参考1:http://www.360doc.co ...

  5. java中的相对目录问题

    在java开发过程中,常常需要使用本地文件内容文件.在调试他人代码的过程中,可能不经意间改变了源代码的根目录(顶级目录),从而导致“java io filenotfoundexception ”.解决 ...

  6. 步步为营-89-SQL语句(删除重复数据)

    1:删除重复数据 --第一步:先找到重复数据 select ProcInstID from record_errorlog group by ProcInstID having count(ProcI ...

  7. hive内group by取第一条数据,Hive中row_number的使用

    1.hive的分组和组内排序---语法 语法: row_number() over (partition by 字段a order by 计算项b desc ) rank rank是排序的别名 par ...

  8. RHEL7恢复root密码

    RHEL7恢复root密码 首先关闭SELINUX [root@panda ~]# getenforce Disabled 然后重启,按↑↓键,进入如下界面,选择第一项,按下e键进行编辑 在此界面找到 ...

  9. 一 time与datetime模块

    时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“type(time.time())”,返回的是float类型. 格式化的时间字 ...

  10. 20165323 实验一 Java开发环境的熟悉

    一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:杨金川 学号:20165323 指导教师:娄嘉鹏 实验日期:2018年4月2日 实验时间:13:45 - 15:25 实验序号:一 实 ...