首页 > 其他分享 >题解:卡农(组合计数+DP)

题解:卡农(组合计数+DP)

时间:2024-03-05 17:22:18浏览次数:21  
标签:题解 空集 偶数 DP text 集合 卡农 dp

题面

image

简化一下,有 \(3\) 个限制:

  1. 不能是空集。
  2. 每个元素出现的次数必须为偶数。
  3. 不能出现两个相同的集。

思路

首先不用状压,但是需要 \(DP\) ,因为 \(n\) 范围过大用状压内存放不下,不然本来状压很好用的。

考虑数学方法 \(+DP\) 。

限制 \(1\)

因为不能有空集,所以可选集合数为 \(2^n-1\) ,接下来的为了方便,设 \(n=2^n-1\) 。

此时显然方案数为 \(\text{C}_n^m\) 。

限制 \(2\)

对于最后一个集合,即集合 \(m\) ,发现当前 \(m-1\) 个集合已经选定的情况下,集合 \(m\) 就确定了。

  • 证明:

    若前面 \(m-1\) 个集合中,元素 \(x\) 出现了奇数次,则集合 \(m\) 中,\(x\) 必须出现;

    同理的,若元素 \(x\) 在前 \(m-1\) 个集合中出现了偶数次,则集合 \(m\) 中,\(x\) 必定不出现。

所以对于此时,最后的合法方案数就变成了 \(\text{C}_n^{m-1}\) 。

同时考虑限制 \(1\) 的影响

其集合 \(m\) 不可为空集,但同时通过上述的证明,若前 \(m-1\) 个集合中,所有元素出现的次数都为偶数,那么集合 \(m\) 只能为空集,则结论不再成立。

于是需要考虑解决方案——使用 \(DP\) 。

定义 \(dp[i]\) 表示 \(m=i\) 时的合法方案数。

对于上面的问题,发现,即若前 \(m-1\) 个集合已经构成了合法状态(满足限制 \(1,2\) ),则集合 \(m\) 一定为空集,即这 \(m\) 个集合无法构成合法状态。

那么此时合法状态数就变成了 \(\text{C}_n^{m-1}-dp[m-1]\) 。

转移方程也出来了,\(dp[i]=\text{C}_n^{i-1}-dp[i-1]\) 。

  • 同时通过此处的证明,不难发现,当 \(m\leq 2\) 时,合法方案数一定为 \(0\) 。

    当 \(m=1\) 时,显然,因为不能是空集,所以出现的元素,其数量必定为 \(1\) 。

    对于 \(m=2\) ,因为限制 \(3\) 中规定不可出现同集,所以集合 \(1\) 中出现的元素在集合 \(2\) 中一定不能出现。

    即 \(dp[1]=dp[2]=0\) 。

限制 \(3\)

对于前 \(i\) 个集合中,存在某个集合与集合 \(i\) 相同,目的就是减去所有此情况下的方案数。

那么去掉这两个相同的集合,则剩下 \(i-2\) 个集合一定是合法的。

  • 证明:

    此时若不考虑限制 \(3\) ,则这 \(i\) 个集合构成合法状态,即所有元素出现次数一定为偶数次。

    那么当前存在集合 \(x\) 与集合 \(y\) 为相同的,只考虑这两个集合中出现的每个元素各出现 \(2\) 次。

    所以去掉这两个集合后,根据 \(偶数-偶数=偶数\) ,所剩 \(i-2\) 个集合中,每个元素出现的次数仍为偶数,为合法状态。

那么对于集合 \(i\) ,它与该 \(i-2\) 个集合均不相同,同时这 \(i-2\) 个集合互不相同,所以集合 \(i\) 可选的集合还剩 \(n-(i-2)\) 种。

由此,此时的方案数为 \(dp[i-2]\times (n-(i-2))\) 。

那么减掉这些方案,\(dp[i]=\text{C}_n^{i-1}-dp[i-1]-dp[i-2]\times (n-(i-2))\) 。

隐藏性质

对于当前所求出来的,并不满足两种方案一定不是同种音乐(见题目描述)。

比如 \(a\{\{1,2\},\{2,3\}\};b\{\{3,2\},\{2,1\}\}\) 为同种音乐。

那么思考如何解决该问题。

对于前 \(i\) 个集合,每一个集合都可以为最后一个确定的集合(即集合 \(i\) ),那么这样的话就有 \(i\) 种情况。

所以 \(dp[i]=\dfrac{\text{C}_n^{i-1}-dp[i-1]-dp[i-2]\times (n-(i-2))}{i}\) 。

一个难理解的地方,为什么只考虑位置 \(i\) 就可以了,不应该是 \(\text{A}_i^i\) 种可能的排列吗?

思考 \(DP\) 的性质,他是一层一层推过来的,用上面的转移方程的话,考虑 \(dp[i]\) 时,\(dp[i-1]\) 已经确定了位置 \(i-1\) ,再往前推,\(dp[i-2]\) 已经确定了位置 \(i-2\) …… \(dp[1]\) 已经确定了位置 \(1\) ,由此一直推过来,所有位置都是确定的。

好的问题解决。

代码如下

#include<bits/stdc++.h>
#define int long long 
#define endl '\n'
using namespace std;
const int N=1e6+10,P=1e8+7;
template<typename Tp> inline void read(Tp&x)
{
    x=0;register bool z=true;
    register char c=getchar();
    for(;c<'0'||c>'9';c=getchar()) if(c=='-') z=0;
    for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
    x=(z?x:~x+1);
}
int n,m,f[N],maxx,c[N];
int qpow(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1) (ans*=a)%=P;
        a=(a*a)%P;
        b>>=1;
    }
    return ans%P;
}
void C(int m)
{
    c[1]=maxx;
    for(int i=2;i<=m;i++)
        c[i]=(i<=maxx)?(((c[i-1]*(maxx-i+1))%P)*qpow(i,P-2))%P:0;
}
signed main()
{
	#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    read(n),read(m);
    maxx=(qpow(2,n)-1+P)%P;
    C(m);
    f[1]=f[2]=0;
    for(int i=3;i<=m;i++)
        f[i]=(((c[i-1]-f[i-1]-((f[i-2]*(maxx-i+2))%P))*qpow(i,P-2))%P+P)%P;
    cout<<f[m];
}
  • 本蒟蒻 \(A\) 的第一道黑题,纪念一下。

标签:题解,空集,偶数,DP,text,集合,卡农,dp
From: https://www.cnblogs.com/Charlieljk/p/18054483

相关文章

  • tomcat8.5+ windows中html页面及控制台中文乱码问题解决办法
    tomcat8.5+windows中html页面及控制台中文乱码问题解决办法————————————————版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/onemy/article/details/106215384 https://blog.csdn.......
  • TCP和UDP可以使用同一个端口号吗?
    TCP和UDP可以使用同一个端口号吗?首先说答案:可以。怎么理解呢?我想这个问题要从计算机网络通信谈起,学过计算机网络的同学,可能都还记得7层或者4层网络模型,TCP/UDP属于其中的传输层协议,在传输层之下是网络层,网络层主要通过IP协议来进行通信,这也是我们日常程序开发中能够接触到的最......
  • 题解 P10220【[省选联考 2024] 迷宫守卫】
    \(\text{Link}\)葬送了我2024省选的一题。题意有一颗深度为\(n+1\)的完全二叉树,其叶子上依次标有一个长为\(2^n\)排列\(a\),非叶结点有选择代价\(b_i\)。Alice、Bob两人进行游戏。Alice可以选择一些选择代价和不超过\(m\)的非叶结点,此后Bob会从根开始深度优先搜索......
  • dpkg安装mysql时失败卸载不掉踩的坑
    原文:https://blog.csdn.net/Camu7s/article/details/43485985nbuntu下彻底卸载mysql:apt-getautoremove--purgemysql-serverapt-getremovemysql-serverapt-getremovemysql-clientapt-getremovemysql-common最后清楚残留数据(important!!!):dpkg-l|grep^rc|awk'{print......
  • 数字音频发送器DP7406替代CS8406
        DP7406是一款功能强大的192K数字音频发送器,其设计旨在满足多种音频格式的需求,包括EIAJCP1201、IEC-60958、AES3和S/PDIF等。这款发送器具备出色的性能,能够接收数字音频信号并进行复用及编码,然后通过SPI或I2C等3线串口数据格式发送给接口单片机。这一特点使得DP7406在......
  • Windows RDP远程漏洞|CVE-2019-0708
    WindowsRDP远程漏洞|CVE-2019-0708目录WindowsRDP远程漏洞|CVE-2019-07081描述:2影响范围:3漏洞检测3.10708detector3.1.1程序说明3.1.2下载地址3.1.3使用方法3.2cve_2019_0708_bluekeep.rb4缓解措施5修复建议:1描述:北京时间2019年5月14日当未经身份验证的攻击者使......
  • 2024-selenium-问题一:java.io.IOException: Invalid Status code=403 text=Forbidden
    问题截图:  问题分析: 参考网址:https://blog.csdn.net/weixin_46739493/article/details/134163739问题解决:1、chrome版本为:版本114.0.5735.199(正式版本);driver的版本为:114.0.5735.90; java-seleium版本为:4.0.0-rc-21<dependency>2<groupId>org.......
  • [省选联考 2024] 题解
    D1T1P10217季风题意有点抽象,大概就是要求我们对两个有若干次重复的序列进行操作,每次可以将这两个序列都向上或向下调整一个值,但是调整的绝对值的总和有限制,问能否最终将总和调整至固定值。由于\(m\)不一定是\(n\)的倍数,因此序列在重复若干次之后可能会遗留一些散块,这是不......
  • P10217 [省选联考 2024] 季风 题解
    [省选联考2024]季风Description给定\(n,k,x,y\)和\(2n\)个整数\(x_0,y_0,x_1,y_1,\dots,x_{n-1},y_{n-1}\)。找到最小的非负整数\(m\),使得存在\(2m\)个实数\(x_0',y_0',x_1',y_1',\dots,x_{m-1}',y_{m-1}'\)满足以下条件,或报告不存在这样的\(m\):\(\s......
  • Luogu P1220 关路灯 题解 [ 蓝 ][ 区间dp ]
    关路灯题目描述某一村庄在一条路线上安装了\(n\)盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。为了给村里节省电费,老张记录下了每盏路灯的位置和功率,他每次关......