题目链接

BZOJ4870

题解

\[ans = \sum\limits_{i = 0}^{\infty}{nk \choose ik + r} \pmod p
\]

发现实际是求

\[ans = \sum\limits_{i = 0}^{\infty}{nk \choose i}[i \mod k = r] \pmod p
\]

设\(f[i][j]\)表示\(i\)个数选出\(x \mod k = j\)个数的方案数

利用组合数递推 + 矩乘转移即可

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define cls(s,v) memset(s,v,sizeof(s))
#define mp(a,b) make_pair<int,int>(a,b)
#define cp pair<int,int>
using namespace std;
const int maxn = 55,maxm = 100005,INF = 0x3f3f3f3f;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();}
return flag ? out : -out;
}
int n,r,K,P;
struct Matrix{
int s[maxn][maxn],n,m;
Matrix(){cls(s,0);n = m = 0;}
}A,F0,F;
inline Matrix operator *(const Matrix& a,const Matrix& b){
Matrix c;
if (a.m != b.n) return c;
c.n = a.n; c.m = b.m;
for (int i = 0; i < c.n; i++)
for (int j = 0; j < c.m; j++)
for (int k = 0; k < a.m; k++)
c.s[i][j] = (c.s[i][j] + 1ll * a.s[i][k] * b.s[k][j] % P) % P;
return c;
}
inline Matrix qpow(Matrix a,LL b){
Matrix re; re.n = re.m = a.n;
for (int i = 0; i < re.n; i++) re.s[i][i] = 1;
for (; b; b >>= 1,a = a * a)
if (b & 1) re = re * a;
return re;
}
int main(){
n = read(); P = read(); K = read(); r = read();
F0.n = K; F0.m = 1; F0.s[0][0] = 1;
A.n = A.m = K;
for (int j = 0; j < K; j++){
A.s[j][j]++;
A.s[j][(j - 1 + K) % K]++;
}
F = qpow(A,1ll * n * K) * F0;
printf("%d\n",F.s[r][0]);
return 0;
}

最新文章

  1. js中Unicode转义序列
  2. App Store2016年最新审核规则
  3. hdu 5677 ztr loves substring 多重背包
  4. asp.net core开发环境准备
  5. sql的OUTER APPLY
  6. Eclipse自动补全功能管理
  7. OC第五节 ——点语法和@property
  8. 好玩的Prim算法
  9. Tomcat服务器启动常见问题
  10. HW3.19
  11. 摆方块(贪心)P1087
  12. linux系统关机与重新启动命令
  13. Shared_from_this 几个值得注意的地方
  14. MultiROM for the XIAOMI MI2S/2C/2! (Kexec HardBoot Enabled with Kexec HardBoot Patch!)
  15. TF-IDF模型详解
  16. ThinkPHP中:多个项目共享同一个session问题
  17. HDU 3377 Plan
  18. 伯努利数学习笔记&amp;&amp;Luogu P3711 仓鼠的数学题
  19. selenium3 调用IE Unable to get browser
  20. C++ Primer 笔记——关联容器

热门文章

  1. Siki_Unity_3-3_背包系统
  2. JavaScript判断对象是否是NULL(转)
  3. 《Redis设计与实现》阅读笔记(二)--简单动态字符串
  4. windows 平台安装 ffmpeg
  5. java事物详解
  6. Vuex 单状态库 与 多模块状态库
  7. Spring入门学习笔记(4)——JDBC的使用
  8. Ruby知识点三:运算符
  9. 学员管理系统(SQLAlchemy 实现)
  10. Daily Scrum (2015/10/30)