[HNOI2011]卡农
Description:
众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则。他将声音分成 n 个音阶,并将音乐分成若干个片段。音乐的每个片段都是由 1 到 n 个音阶构成的和声,即从 n 个音阶中挑选若干个音阶同时演奏出来。为了强调与卡农的不同,他规定任意两个片段所包含的音阶集合都不同。同时为了保持音乐的规律性,他还规定在一段音乐中每个音阶被奏响的次数为偶数。现在的问题是:小余想知道包含 m 个片段的音乐一共有多少种。两段音乐 a 和 b 同种当且仅当将 a 的片段重新排列后可以得到 b。例如:假设 a
为{{1,2},{2,3}},b 为{{3,2},{2,1}},那么 a 与 b 就是同种音乐。由于种数很多,你只需要
输出答案模 100000007(质数)的结果。
Hint:
n≤106
Solution:
毒瘤组合数学题
首先我们可以不考虑音乐顺序,最后答案除以m!即可
易知所有非空子集数量为2n−1
设dp[i]为选了i段时的合法音乐种数
为了满足出现次数为偶数,我们可以这样考虑:
对于一种i-1段的音乐,第i段的集合一定由之前的奇数位唯一确定
即方案数为Ai−12n−1 (想一想,为什么?)
因为要考虑空集,所以就减去一个dp[i−1]
现在需要去重,我们钦定一个位置与i相同,于是需要减去方案数:
dp[i−2]∗(i−1)∗(2n−1−(i−2))
这就完了
dp[i]=Ai2n−1−dp[i−1]−dp[i−2]∗(i−1)∗(2n−i+1)
其中 dp[0]=1,dp[1]=0
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ls p<<1
#define rs p<<1|1
using namespace std;
typedef long long ll;
const ll mxn=1e6+5,mod=1e8+7;
ll n,m,tp,inv,a[mxn],dp[mxn];
inline ll read() {
char c=getchar(); ll x=0,f=1;
while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
while(c<='9'&&c>='0') {x=(x<<3)+(x<<1)+(c&15);c=getchar();}
return x*f;
}
inline ll chkmax(ll &x,ll y) {if(x<y) x=y;}
inline ll chkmin(ll &x,ll y) {if(x>y) x=y;}
ll qpow(ll a,ll b)
{
ll res=1,bs=a;
while(b) {
if(b&1) res=1ll*res*bs%mod;
bs=1ll*bs*bs%mod;
b>>=1;
}
return res;
}
int main()
{
n=read(); m=read();
inv=a[0]=1;
for(ll i=2;i<=m;++i) inv=1ll*inv*i%mod;
inv=qpow(inv,mod-2); tp=qpow(2,n)-1;
for(ll i=1;i<=m;++i) a[i]=1ll*a[i-1]*(tp-i+1)%mod; dp[0]=1;
for(ll i=2;i<=m;++i) {
dp[i]=(a[i-1]-dp[i-1]+mod)%mod;
dp[i]=(dp[i]-1ll*dp[i-2]*(i-1)%mod*(tp-(i-2)+mod)%mod+mod)%mod;
}
printf("%lld",1ll*dp[m]*inv%mod);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用