Description

我们称一个仅由0、1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻的0)。例如,000,001

,101,都是交错序列,而110则不是。对于一个长度为n的交错序列,统计其中0和1出现的次数,分别记为x和y。

给定参数a、b,定义一个交错序列的特征值为xayb。注意这里规定任何整数的0次幂都等于1(包括0^0=1)。

显然长度为n的交错序列可能有多个。我们想要知道,所有长度为n的交错序列的特征值的和,除以m的余数。(m是

一个给定的质数)例如,全部长度为3的交错串为:000、001、010、100、101。

Solution

看到 \(x^ay^b\) 容易想到要展开,然后就发现变成了

\[y^b*\sum_{i=0}^{a}(-1)^{a-i}*C_{a}^{i}*n^{i}*y^{a-i}
\]

\[\sum_{i=0}^{a}(-1)^{a-i}*C_{a}^{i}*n^{i}*y^{a+b-i}
\]

这样就只需要统计 \(\sum y^{a+b-i}\) 了

\(f[i][j][0/1]\) 表示这一位填 \(0/1\) 的特征值的 \(j\) 次方之和

如果增加一个 \(1\),\(y^{j}\) 就要变成 \((y+1)^{j}\),二项式定理展开做个差

发现就是 \(\sum_{k=0}^{j-1}C_{j}^{k}*y^k\)

而 \(f[i][k]\) 就是 \(y^k\)

转移系数就确定了,矩阵快速幂优化一下就好了

千万不要像我一样拆成了 \(x^a*(n-x)^b\),转移复杂一些,常数大的过不去

#include<bits/stdc++.h>
using namespace std;
const int N=205;
int n,a,b,mod,c[N][N],m,d;
inline void priwork(){
for(int i=0;i<N;i++){
c[i][0]=1;
for(int j=1;j<=i;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
}
struct mat{
int a[N][N];
mat(){}
inline mat operator *(const mat &p)const{
mat ret;
for(int i=0;i<m;i++)
for(int j=0;j<m;j++){
ret.a[i][j]=0;
for(int k=0;k<m;k++)
if(a[i][k] && p.a[k][j])
ret.a[i][j]=(ret.a[i][j]+1ll*a[i][k]*p.a[k][j])%mod;
}
return ret;
}
}S,T;
inline void solve(){
for(int i=0;i<d;i++){
T.a[i+d][i]=1;T.a[i][i]=1;
for(int j=i;j<d;j++)T.a[i][j+d]=c[j][i];
}
int k=n;
S.a[0][0]=1;
while(k){
if(k&1)S=S*T;
T=T*T;k>>=1;
}
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
int ans=0;
memset(S.a,0,sizeof(S.a));memset(T.a,0,sizeof(T.a));
cin>>n>>a>>b>>mod;d=a+b+1;m=d*2;
priwork();solve();
for(int i=0;i<d;i++)S.a[0][i]=(S.a[0][i]+S.a[0][i+d])%mod;
for(int i=0,t=1;i<=a;i++,t=1ll*t*n%mod)
ans=(ans+1ll*((a-i)&1?-1:1)*c[a][i]*t%mod*S.a[0][a+b-i])%mod;
if(ans<0)ans+=mod;
cout<<ans<<endl;
return 0;
}

最新文章

  1. 获取APP最新版本的接口案例
  2. 从网易与淘宝的font-size思考前端设计稿与工作流
  3. Research on Unsupervised Word Alignment Based on Inversion Transduction Grammar
  4. Delphi 用Web App Debugger简单调试ISAPI 转
  5. mybatis 并发问题解决,参考hibernate
  6. UML和模式
  7. ResultSet.TYPE_SCROLL_SENSITIVE问题(完全摘自他人)
  8. [国嵌攻略][104][Linux内核模块设计]
  9. 本地Git与Github建立关联
  10. npm修改淘宝原
  11. python中np.multiply()、np.dot()和星号(*)三种乘法运算的区别(转)
  12. EOS智能合约授权限制和数据存储
  13. css3学习--select怎么去掉默认样式
  14. sourceInsight工具移除不掉项目 source Insight Add and Remove Project Files
  15. 忽略时间的小时分,展示的方法 data函数
  16. 【题解】 [ZJOI2012]灾难 (拓扑排序+LCA)
  17. centos下安装配置mongodb
  18. 使用 Json 文件存储
  19. 《机器学习实践》程序清单3-7 plotTree函数
  20. 双击打开excel时提示:向程序发送命令时出现问题

热门文章

  1. Flutter的使用教学笔记
  2. django使用auth模块进行身份认证
  3. Django 实现网站注册用户邮箱验证功能
  4. Java中的Random()函数-----转载
  5. 中国版Azure 文件服务
  6. JSON的key值为数字时如何使用
  7. if __name__ == &#39;__main__&#39;是什么意思?如何理解?看到一个很有用的解答
  8. 洛谷 P1486 [NOI2004]郁闷的出纳员
  9. Qt 学习之路 2(43):QStringListModel
  10. asp web服务