显然答案为Σkb·(n-k)a·C(n-k+1,k)。并且可以发现ΣC(n-k,k)=fibn。但这实际上没有任何卵用。

  纯组合看起来不太行得通,换个思路,考虑一个显然的dp,即设f[i][j][0/1]为前i为选了j个1其中第i位是0/1的方案数。这样当然能求出答案,复杂度O(n2)。

  注意到ab很小,并且事实上我们并不需要知道所有的方案数,而是只要求出贡献就可以了。而又有xayb=xa(n-x)b,这个式子显然只要求出所有Σxi就能求了。再由二项式定理,(k+1)b=ΣC(b,i)ki。那么做法就比较显然了,维护上述矩阵大力矩乘即可。

  非常卡常。在bzoj排倒数第二2333

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 190
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,A,B,P,ans,C[N][N];
inline void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
int ksm(int a,int k)
{
int s=;
for (;k;k>>=,a=1ll*a*a%P) if (k&) s=1ll*s*a%P;
return s;
}
struct matrix
{
int n,a[N][N];
matrix operator *(const matrix&b) const
{
matrix c;c.n=n;memset(c.a,,sizeof(c.a));
for (int i=;i<n;i++)
for (int j=;j<b.n;j++)
for (int k=;k<b.n;k++)
inc(c.a[i][j],1ll*a[i][k]*b.a[k][j]%P);
return c;
}
}f,a;
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj5298.in","r",stdin);
freopen("bzoj5298.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
m=n=read(),A=read(),B=read(),P=read();
C[][]=;
for (int i=;i<N;i++)
{
C[i][]=C[i][i]=;
for (int j=;j<i;j++)
C[i][j]=(C[i-][j-]+C[i-][j])%P;
}
f.n=;f.a[][]=;
a.n=A+B+<<;
for (int i=;i<=A+B;i++) a.a[i][i]++,a.a[i+A+B+][i]++;
for (int i=;i<=A+B;i++)
for (int j=i;j<=A+B;j++)
inc(a.a[i][j+A+B+],C[j][i]);
for (;n;n>>=,a=a*a) if (n&) f=f*a;
for (int i=;i<=A+B;i++) inc(f.a[][i],f.a[][i+A+B+]);
for (int i=B;i<=A+B;i++)
if (i-B&) inc(ans,P-1ll*f.a[][i]*ksm(m,A+B-i)%P*C[A][i-B]%P);
else inc(ans,1ll*f.a[][i]*ksm(m,A+B-i)%P*C[A][i-B]%P);
cout<<ans;
return ;
}

最新文章

  1. redis 基础知识
  2. jq 获取table元素,ajax 静态填加数据
  3. SQL面试积累
  4. lastLogon和lastLogonTimestamp的区别
  5. Java: xml转换
  6. iOS 开发之照片框架详解(1)
  7. define
  8. php代码生成二维码
  9. redis服务器安装-SuSE Linux Enterprise Server 11 SP3
  10. C++移位运算符详解
  11. Python零基础学习系列之二--Python介绍及环境搭建
  12. JavaSE初步学习笔记
  13. Activi相关表归纳
  14. 如果redis没有设置expire,他是否默认永不过期?
  15. Luogu4249 WC2007 石头剪刀布 费用流
  16. webpack4 自学笔记一(babel的配置)
  17. Ubuntu 14.04安装QQ2012
  18. RabbitMQ(一):Window安装RabbitMQ
  19. 【多视图几何】TUM 课程 第6章 多视图重建
  20. [转] C#与Java的比较

热门文章

  1. 接口测试之基础篇--http协议
  2. How to: Display a Non-Persistent Object&#39;s List View from the Navigation
  3. SpringBoot日记——按钮的高亮和添加篇
  4. php js css加载合并函数 宋正河整理
  5. C#如何在各类控件中输入\输出数据
  6. 高可用OpenStack(Queen版)集群-1. 集群环境
  7. DDMS_Threads的简单使用
  8. The Art of Multiprocessor Programming读书笔记 (更新至第3章)
  9. 奔跑吧DKY——团队Scrum冲刺阶段-Day 4
  10. 2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算