\(\text{Update}\)(2019.10.05):

  1. 递推公式推法更详细;
  2. 通项公式更新详细版;
  3. 单位矩阵的推法更加详细。

特别鸣谢 @Smallbasic 苣佬,是他教会了我推递推公式和通项公式。


吐槽:来自同机房巨佬的嘲讽——这道题这么简单,观察法显然可得通项公式


题目分析:

  1. 分析题面,原题意思如下:

    从\(n\)个互不相同的数中取出某些数,将这些数分成两个集合\(A,B\),这两个集合满足两个条件:

    • $A $ 集合中的最大的数小于 \(B\)集合中最小的数

    • $A,B \neq \emptyset $

    求共有多少种分法(结果对 \(10^9+7\) 取模)

  2. 显然可以发现这题是一道组合数学的题,先手算 \(n \leq 10\) 的数据,在找规律推出公式。我给一下我的思路:

    1. 当 \(n=2\) 时,答案显然为1

    2. 当 \(n=3\) 时,设这些数为 \(a_1,a_2,a_3\) ,不妨设 \(a_1<a_2<a_3\)

      1. 当取3个数时,有以下分法:
        \[A=\{a_1 \},B=\{a_2,a_3\} \\
        A=\{a_1,a_2\},B=\{a_3\}
        \]

      共 \(C^3_3 \times (3-1)=2\) 种

      1. 当取2个数时,有以下分法:

      \[ A=\{a_1\},B=\{a_2\}\\
      A=\{a_1\},B=\{a_3\}\\
      A=\{a_2\},B=\{a_3\}
      \]

      共 \(C_3^2 \times (2-1)=3\) 种

      综上,当 \(n=3\) 时,有 \(C^3_3 \times (3-1)+C_3^2 \times (2-1)=5\) 种分法。

    3. 当 \(n=4\) 时,设这些数为 \(a_1,a_2,a_3,a_4\) ,不妨设 \(a_1<a_2<a_3<a_4\)

      1. 当取4个数时,有以下分法:

      \[ A=\{a_1\},B=\{a_2,a_3,a_4\}\\
      A=\{a_1,a_2\},B=\{a_3,a_4\}\\
      A=\{a_1,a_2,a_3\},B=\{a_4\}
      \]

      共 \(C^4_4 \times (4-1)=3\) 种

      1. 当取3个数时,有以下分法:

        \[A=\{a_1\},B=\{a_2,a_3\}\\
        A=\{a_1\},B=\{a_2,a_4\}\\
        A=\{a_1\},B=\{a_3,a_4\}\\
        A=\{a_2\},B=\{a_3,a_4\}\\
        A=\{a_1,a_2\},B=\{a_3\}\\
        A=\{a_1,a_2\},B=\{a_4\}\\
        A=\{a_1,a_3\},B=\{a_4\}\\
        A=\{a_2,a_3\},B=\{a_4\}
        \]

        共 \(C^3_4 \times (3-1)=8\) 种

      2. 当取2个数时,有以下分法:

        \[A=\{a_1\},B=\{a_2\}\\
        A=\{a_1\},B=\{a_3\}\\
        A=\{a_1\},B=\{a_4\}\\
        A=\{a_2\},B=\{a_3\}\\
        A=\{a_2\},B=\{a_4\}\\
        A=\{a_3\},B=\{a_4\}
        \]

        共 \(C^2_4 \times (2-1)=6\) 种

      综上,当 \(n=4\) 时,有 \(C^4_4 \times (4-1)+C^3_4 \times (3-1)+C^2_4 \times (2-1)=17\) 种分法。

    4. 通过数学归纳(找规律),可得公式:

      \[F(n)=\sum_{i=1}^{n-1}C^{i+1}_n \cdot i
      \]

    具体实现的代码就不写了,其他dalao有写。

    时间复杂度:\(O(n^2)\)

    空间复杂度:\(O(n^2)\)

    预计得分:40 points

  3. 考虑优化。

    发现公式中的瓶颈在于如何快速处理组合数,于是开始推递推公式:

    \[\]

    \begin{aligned}

    & F(n+1)-2F(n)\

    & =\sum_{i=1}{n}C{i+1}{n+1} \cdot i-(\sum{i=1}{n-1}C{i+1}n \cdot i)\times 2 \

    & =\sum
    {i=1}{n}C{i}_{n+1}\

    & =2^{n}-1

    \end{aligned}

    \end{equation}

    \[

    故得:$F(n+1)=2F(n)+2^n-1$

    代码就不写了

    时间复杂度:$O(n)$

    空间复杂度:$O(n)$

    预计得分:60 points

    \]

    已经写出递推公式的话有两种思路:1. 数学方法推通项公式;2. 矩阵快速幂加速递推公式。

    • 方法一:数学方法推通项公式:

      \[\begin{equation}
      \begin{aligned}
      & F(n)=\sum_{i=1}^{n-1}C_n^{i+1}\cdot i\\
      & =\sum_{i=1}^{n-1}{n!\over(i+1)!(n-i-1)!}\cdot i \\
      & =\sum_{i=2}^n{n!\over i!(n-i)!} \cdot i+{n!\over i!(n-i)!}\\
      & =\sum_{i=2}^n{n!\over(i-1)!(n-i)!}+C_n^i \\
      \]

      & ={\sum_{i=2}n{C_n{i-1}}+(n-i+1)(2^n-n-1)\over n-i+1} \

      & ={2{n-1}-n-2+(n-i+1)(2n-n-1)\over n-i+1}

      \end{aligned}

      \end{equation}

      \[

      \]

这里 \(2^{n-1}\) 用快速幂实现(注意,不能用 \(<<\) 来做,会爆 long long)

代码见code1

时间复杂度:\(O(\text{log}n)\)

空间复杂度:\(O(1)\)

预计得分:100 points

  • 方法二:矩阵快速幂优化:

    个人认为这个方法可能鲜有人能想到(太麻烦了),我就仔细讲一讲。

    首先,观察递推公式中有如下几个影响值:\(F(n-1),2^{n-1},1\) ,故与单位矩阵相乘的矩阵为

    \[\begin{bmatrix}
    F(n-1)\\ 2^{n-1}\\ 1
    \end{bmatrix}
    \]

    得到的矩阵为

    \[\begin{bmatrix}
    F(n)\\ 2^{n}\\ 1
    \end{bmatrix}
    \]

    有递推式显然可得:

    \[ \begin{cases}
    F(n)=F(n-1)\times 2+2^{n-1}\times 1+1\times(-1)\\
    2^n=F(n-1)\times0+2^{n-1}\times 2+1\times 0 \\
    1=F(n-1)\times 0+2^{n-1}\times 0+1\times 1
    \end{cases}
    \]

    (不会矩阵加速的可以做一做 P1939 【模板】矩阵加速(数列)P1962 斐波那契数列

    推出单位矩阵:

    \[\begin{bmatrix}
    2&1&-1\\ 0&2&0\\ 0&0&1
    \end{bmatrix}
    \]

    故矩阵递推式为:

    \[\begin{bmatrix}
    F(n-1)\\ 2^{n-1}\\ 1
    \end{bmatrix}
    \times
    \begin{bmatrix}
    2&1&-1\\ 0&2&0\\ 0&0&1
    \end{bmatrix}
    =
    \begin{bmatrix}
    F(n)\\ 2^{n}\\ 1
    \end{bmatrix}
    \]

    化为矩阵幂形式得:

    \[\begin{bmatrix}
    F(2)\\ 2^2\\ 1
    \end{bmatrix}
    \times
    \begin{bmatrix}
    2&1&-1\\ 0&2&0\\ 0&0&1
    \end{bmatrix}^{n-2}
    =
    \begin{bmatrix}
    F(n)\\ 2^{n}\\ 1
    \end{bmatrix}
    \]

    套魔板即可。

    代码见code2

    时间复杂度:\(O(\text{log}n)\)

    空间复杂度:\(O(1)\)

两种方法的优劣:

  • 第一种方法难算,需要较好的数学基础,但最后实现时时间复杂度在 \(O(1)\) — \(O(\text{log}n)\) ,常数极小。
  • 第二种方法是数列加速的常用方法,简单易想,但常数较大,本题为常数为27,即在大数据下比第一种方法慢2—3倍

Code1:

 #include<bits/stdc++.h>
//#define file
#define modn (int)(1e9+7)
#define int long long
using namespace std;
int n;
inline int ksm(int x,int y,int p)
{
if(y==0) return 1%p;
if(y==1) return x%p;
int rst=ksm(x,y/2,p)%p;
if(y%2==0)
{
return rst*rst%p;
}else
{
int tmp=rst*rst%p;
return tmp*x%p;
}
}
signed main()
{
#ifdef file
freopen("Agent1.in","r",stdin);
freopen("Agent1.out","w",stdout);
//F(n)=\sum_{i=1}^{n-1}C^(i+1)_n*i
//F(n)=F(n-1)*2+2^{n-1}-1
#endif
scanf("%lld",&n);
int ans=(n-2)*ksm(2,n-1,modn)%modn+1;
printf("%lld\n",ans);
return 0;
}

AC,49ms / 800.00KB


Code2(本代码为我的教练所写,码风可能有些许不同):

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 1000000007
int jz[3][3] = {{2,1,-1},{0,2,0},{0,0,1}},
jz1[3][3] = {{2,1,-1},{0,2,0},{0,0,1}};
int base[3][3];
void cheng()
{
memset(base,0,sizeof(base));
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
for(int k=0;k<3;k++)
{
base[i][j] += jz1[i][k]*jz1[k][j];
base[i][j] = (base[i][j]+mod)%mod;
}
}
}
memcpy(jz1,base,sizeof(base));
}
void chengjz()
{
memset(base,0,sizeof(base));
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
for(int k=0;k<3;k++)
{
base[i][j] += jz1[i][k]*jz[k][j];
base[i][j] = (base[i][j]+mod)%mod;
}
}
}
memcpy(jz1,base,sizeof(base));
}
void quickpow(int k)
{
if(k==1) return;
quickpow(k/2);
cheng();
if(k%2!=0) chengjz();
}
signed main()
{
int n;
cin>>n;
if(n==2)
{
printf("1");
return 0;
}
quickpow(n-2);
int ans = (jz1[0][0]+ 4*jz1[0][1]%mod + mod + 1*jz1[0][2]) mod;
cout<<ans;
return 0;
}

AC,48ms / 796.00KB

P4936 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. 解决本地Bootstrap字体图标不可见的问题

    原文:https://www.jianshu.com/p/70ac459d33e7 作为Bootstrap的初学者,我最近遇到了一个问题:在使用Bootstrap字体图标时,图标不可见.使用代码如下: ...

  2. 在Visual Studio 2019中安装Blend 4.5 SDK

    Visual Studio 2017安装时可以指定Blend SDK,到Visual Studio 2019时,安装时已经没有这个选项了. 官方提供的只有老版本4.0的安装包.要使用Blend SDK ...

  3. 解决打开IE报错“无法启动...丢失api-ms-win-core-path-l1-1-0.dll”的问题

    打开IE突然发现报错 试了各种方法都不行 最终看这篇文章,才解决:https://www.yijile.com/log/577.html 打开IE设置选项,选择管理加载项,如图讲该选项禁用,就不报错. ...

  4. 【i.MX6UL/i.MX6ULL开发常见问题】单独编译内核,uboot生成很多文件,具体用哪一个?

    [i.MX6UL/i.MX6ULL开发常见问题]2.3单独编译内核,uboot生成很多文件,具体用哪一个? 答:内核编译出来的文件是~/MYiR-imx-Linux/arch/arm/boot/目录下 ...

  5. Doctype作用,标准模式与兼容模式的区别

    <!DOCTYPE>声明位于位于HTML文档中的第一行,处于 <html> 标签之前.告知浏览器的解析器用什么文档标准解析这个文档.DOCTYPE不存在或格式不正确会导致文档以 ...

  6. Oracle 11g 体系结构概述

    一.Oracle 体系结构主要用来分析数据库的组成.工作过程与原理,以及数据在数据库中的组织与管理机制. Oracle 数据库是一个逻辑概念,而不是物理概念上安装了 Oracle 数据库管理系统的服务 ...

  7. 使用PATH变量进行Linux权限升级技巧

    0x00 前言 在解决了几个OSCP挑战之后,我们决定写一篇关于用于Linux权限升级的各种方法的文章,这对我们的读者在其渗透测试项目中有所帮助.在本文中,我们将学习“使用$path变量的各种方法”以 ...

  8. java开发手册-总结与补充

    1.分层领域模型规约 1.DO( Data Object):与数据库表结构一一对应,通过 DAO 层向上传输数据源对象. 2.DTO( Data Transfer Object):数据传输对象, Se ...

  9. Springboot项目中Pom.xml报错

    摘要:使用idea,两次在maven上浪费时间,第一次不知道怎么就解决了,第二次记录一下解决办法 参考博客地址: https://blog.csdn.net/u013129944/article/de ...

  10. A quick introduction to Google test

    视频参考:Google C++ Testing GTest GMock Framework 为什么要使用 Google C++ Testing Framework? 使用这个框架有许多好理由.本文讨论 ...