题目链接

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;
}

BZOJ4870 [Shoi2017]组合数问题 【组合数 + 矩乘】的更多相关文章

  1. BZOJ4870: [Shoi2017]组合数问题

    4870: [Shoi2017]组合数问题 Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ...

  2. BZOJ4870:[SHOI2017]组合数问题(组合数学,矩阵乘法)

    Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 ...

  3. [BZOJ4870][Shoi2017]组合数问题 dp+矩阵乘

    4870: [Shoi2017]组合数问题 Time Limit: 10 Sec  Memory Limit: 512 MB Description Input 第一行有四个整数 n, p, k, r ...

  4. bzoj4870: [Shoi2017]组合数问题(DP+矩阵乘法优化)

    为了1A我居然写了个暴力对拍... 那个式子本质上是求nk个数里选j个数,且j%k==r的方案数. 所以把组合数的递推式写出来f[i][j]=f[i-1][j]+f[i-1][(j-1+k)%k].. ...

  5. [BZOJ4870][六省联考2017]组合数问题(组合数动规)

    4870: [Shoi2017]组合数问题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 748  Solved: 398[Submit][Statu ...

  6. 洛谷$P$3746 [六省联考2017]组合数问题 $dp$+矩乘+组合数学

    正解:$dp$+矩乘+组合数学 解题报告: 传送门! 首先不难发现这个什么鬼无穷就是个纸老虎趴,,,最多在$\binom{n\cdot k+r}{n\cdot k}$的时候就已经是0了后面显然不用做下 ...

  7. HDU 6114 Chess【逆元+组合数】(组合数模板题)

    <题目链接> 题目大意: 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子.一天,小度在棋盘上摆起了许多車……他想知道,在一共N×M个点的矩形棋盘中摆最多个数的車使 ...

  8. LuoguP2822 组合数问题(组合数,二维前缀和)

    P2822 组合数问题 输入输出样例 输入样例#1: 复制 1 2 3 3 输出样例#1: 复制 1 输入样例#2: 复制 2 5 4 5 6 7 输出样例#2: 复制 0 7 说明 [样例1说明] ...

  9. SDUT1586 计算组合数(组合数)

    这个题数据量小,不容易超时. #include<stdio.h> long long fac(int n) { ; ; i <= n ; i++) { m = i*m; } retu ...

随机推荐

  1. SVN For Mac: Cornerstone.app破解版免费下载

    Cornerstone.app下载地址 链接:https://pan.baidu.com/s/1kwQ65SBgfWXQur8Zdzkyyw  密码:rqe7 Cornerstone303 MAS.a ...

  2. docker中创建MySQL及在外部使用Navicat连接

    1:获取MySQL镜像 运行 docker pull mysql [root@MyCentos7- ~]# docker pull mysql Using default tag: latest la ...

  3. http跳转https方法:百度云如何让http自动跳转到https【免费SSL证书使用FAQ】

    之前的一篇文章已经给大家提供了免费SSL证书的申请方法,这一篇文章是告诉大家在使用免费的SSL证书时可能会遇到的问题[怎么让http自动跳转到https以及http与https同时使用]的解决方法. ...

  4. python操作hive并且获取查询结果scheam

    执行hive -e 命令并且获取对应的select查询出来的值及其对应的scheam字段 需要在执行语句中前部添加 set hive.cli.print.header=true; 这个设置,如下语句: ...

  5. Linux 学习记录 20170218

    一.Linux 硬件查看命令     ----/proc 文件系统是一种内核和内核模块用来向进程(process) 发送信息的机制.我们可以从这个文件里获取到系统的相关信息. 1.显卡信息dmesg ...

  6. C++ 类的定义与实现

    摘自这篇博客https://blog.csdn.net/xulingxin/article/details/81335030   一."类" 的介绍     在C++中, 用 &q ...

  7. Dailu Scrum (2015/10/27)

    在周日晚上PM已经为大家分配了部分的代码修改工作,今天晚上PM召集了被分配代码工作的3个DEV一起讨论要求修改的代码.在共同讨论的过程中确有发现以下代码的不规范之处,PM当即要求我们先要修改规范代码的 ...

  8. Scrum Meeting 10.31

    成员 今日任务 明日任务 今日工作时长 徐越 整理开发文档,学习ip相关知识,学习servlet相关知识 代码迁移,学习数据库相关知识 5h 赵庶宏 学习学长的servlet代码 进行数据库的连接 4 ...

  9. Hive问题

    今天一直遇到一个问题: 在查询最热10个关键词时候总是报错,下图为报错最下面 一直关注着failed的内容,头疼了一天.........  结果实验室老哥给指出问题,是yarnException报错, ...

  10. flownet2.0 caffe anaconda2 编译安装

    1. 下载flownet2.0源码到指定目录 cd /home/zzq/saliency_models/deep_optical_flow git clone https://github.com/l ...