题解 P3214 【[HNOI2011]卡农】
题目分析
假如题目没有每个音阶被奏响的次数为偶数的限制,则答案就是
加上这个限制后,我们可以发现,一旦确定了前
但是容易发现如果所有音阶在前
怎么去掉不合法的方案呢?我们令
同时因为每种方案都重复了
那么我们就得出了递推式
直接递推就好了!
#include<bits/stdc++.h>
using namespace std;
template<class T>inline void read(T &x)
{
x=0;
char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))x=x*10+(c&15),c=getchar();
}
#define P 100000007
#define N 1000001
int n,m,x,f[N],C;
inline int ksm(int a,int b=P-2)//快速幂
{
int s=1;
for(;b;b>>=1,a=(long long)a*a%P)if(b&1)s=(long long)s*a%P;
return s;
}
signed main()
{
read(n),read(m),x=ksm(2,n)-1;
if(x<0)x+=P;
C=(long long)x*(x+P-1)%P*ksm(2)%P;
for(register int i=3;i<=m;i++)
{
f[i]=((C-f[i-1]-(long long)f[i-2]*((x-i+2+P)%P)%P)%P+P)%P*ksm(i)%P,C=(long long)C*(x-i+1+P)%P*ksm(i)%P;
}
printf("%d\n",f[m]);
return 0;
}