4870: [Shoi2017]组合数问题

题意:求

\[\sum_{i=0}^{n-1} \binom{nk}{ik+r} \mod p
\]

\(n \le 10^9, 0\le r < k \le 50\)


组合数推了一下,有一些有趣的性质但是并不好做

想到了从意义方面考虑,但是没有深入,去看了题解


n大k小,一副矩乘的样子

就是求“n个物品取模k余r个的方案数”

因为取的个数模k,变得很有意思,可以把组合数的递推式矩乘了...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline int read() {
char c=getchar(); int x=0,f=1;
while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x*f;
} int n, mo, k, r;
struct matrix {
int a[51][51];
matrix() {memset(a, 0, sizeof(a));}
int* operator [](int x) {return a[x];}
} f, a;
matrix operator *(matrix a, matrix b) {
int n = k;
matrix c;
for(int i=0; i<n; i++)
for(int k=0; k<n; k++) if(a[i][k])
for(int j=0; j<n; j++) if(b[k][j])
c[i][j] = (c[i][j] + (ll) a[i][k] * b[k][j] %mo) %mo;
return c;
}
matrix operator ^(matrix a, ll b) {
int n = k;
matrix c;
for(int i=0; i<n; i++) c[i][i] = 1;
for(; b; b>>=1, a=a*a) if(b&1) c=c*a;
return c;
} int Pow(ll a, int b) {
ll ans=1;
for(; b; b>>=1, a=a*a%mo)
if(b&1) ans=ans*a%mo;
return ans;
}
int main() {
freopen("in", "r", stdin);
n=read(); mo=read(); k=read(); r=read();
if(k == 1) {printf("%d", Pow(2, n)); return 0;}
for(int i=0; i<k; i++) f[i][i] = 1, f[(i+1)%k][i] = 1;
f = f ^ ((ll) n * k);
a[0][0] = 1;
a = f * a;
printf("%d\n", a[r][0]);
}

bzoj 4870: [Shoi2017]组合数问题 [矩阵乘法优化dp]的更多相关文章

  1. BZOJ 4870: [Shoi2017]组合数问题 矩阵乘法_递推

    Code: #include <cstdio> #include <cstring> #include <algorithm> #define setIO(s) f ...

  2. 形态形成场(矩阵乘法优化dp)

    形态形成场(矩阵乘法优化dp) 短信中将会涉及前\(k\)种大写字母,每个大写字母都有一个对应的替换式\(Si\),替换式中只会出现大写字母和数字,比如\(A→BB,B→CC0,C→123\),代表 ...

  3. 斐波那契数列 矩阵乘法优化DP

    斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007​\),\(n\le 10^{18}​\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...

  4. [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】

    题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...

  5. BZOJ 4870 [Shoi2017]组合数问题 ——动态规划 矩阵乘法

    注意到$r<k$ 别问我为什么要强调. 考场上前30分水水. 然后写阶乘的时候大力$n\log {n}$预处理 本机跑的挺快的,然后稳稳的T掉了. 然后就是简单的矩阵乘法了. #include ...

  6. 矩阵乘法优化DP复习

    前言 最近做毒瘤做多了--联赛难度的东西也该复习复习了. Warning:本文较长,难度分界线在"中场休息"部分,如果只想看普及难度的可以从第五部分直接到注意事项qwq 文中用(比 ...

  7. 矩阵乘法优化DP

    本文讲一下一些基本的矩阵优化DP的方法技巧. 定义三个矩阵A,B,C,其中行和列分别为$m\times n,n \times p,m\times p$,(其中行是从上往下数的,列是从左往右数的) $C ...

  8. 51nod 1583 犯罪计划——矩阵乘法优化dp

    文泽想在埃及做案n次,并且想在最后不用得到惩罚.案件的被分成几种类型.比如说,案件A,当案件A被重复犯两次时,案件A将被认为不是犯罪案件,因此犯案人不用得到惩罚.也就是说,案件A被犯偶数次时,犯案人将 ...

  9. 【bzoj2476】战场的数目 矩阵乘法优化dp

    题目描述 (战场定义为对于最高的一列向两边都严格不增的“用积木搭成”的图形) 输入 输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周 ...

随机推荐

  1. BZOJ2338: [HNOI2011]数矩形

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2338 中学数学老师告诉我们,一个矩形的两条对角线相等,所以只要把所有的边拿出来,记录下中点坐标 ...

  2. SQL强化(一)保险业务

    保险业务 : 表结构 : sql语句 : /*1. 根据投保人电话查询出投保人 姓名 身份证号 所有保单 编号 险种 缴费类型*/SELECTt2.cust_name,t2.idcard,t4.pro ...

  3. TI-RTOS 控制LED灯

    TI将FreeRtos放在自家芯片上,于是得到了TI-RTOS,两者的区别我还不太清楚,近日因为项目需要,开始试用TI-RTOS,先来一个点灯的实验吧,算是 hello world. 这次手上的板子是 ...

  4. 基于ARM的车牌识别技术研究与实现

    在云盘里包含了我本科毕业设计的全部资料和代码.主要涉及下面摘要中的几个部分.虽然系统无法实用,但是适合机器视觉和嵌入式方向的入门.希望能对有志从事相关方向的朋友有所帮助.本人现在在深圳从事机器视觉算法 ...

  5. Angular 4 设置组件样式的几种方式

      你用Angular吗? 一.介绍 如何只改动最简单的css代码,呈现完全不一样的视图效果. 第一种:最基本的设置:   图1 代码 图2 界面运行效果图 平常,想给一个label或者p等标签添加样 ...

  6. 【笔记】css 实现宽度自适应屏幕 高度自适应宽度

    如果说宽高自适应屏幕尺寸那么大家可能会想到 div{ width: 100%; height: 100% } 但是如果我要自适应屏幕尺寸的同时还要变成正方形呢?(高度和宽度相等而高度不能写死) 那就要 ...

  7. MySQL 取得小时分钟部分

    MySQL 取得小时分钟部分 SELECT `CpParkID` , DATE_FORMAT( `UPDATE_TIME` , '%H:%i' )FROM `cp_park`WHERE HOUR( ` ...

  8. Python---socket库

    为方便以后查询和学习,特从常用库函数和示例来总结socket库 1. 术语 family:AF_INET socktype:SOCK_STREAM或SOCK_DGRAM protocol:IPPROT ...

  9. 输入和输出--File类

    输入和输出 写在前面的:Java中的输入和输出还是比较重要的,之前我都没想整理IO和多线程的,但是在研究后面的好多东西时候,经常要读取资源文件,这个时候就不得不回过头来整理IO了.要玩熟Java的输入 ...

  10. Oracl Over函数

    Oracl Over函数 简介 在介绍Over之前, 必须提到开窗函数, 与 聚 合函数一样, 开窗函数也是对行集组进行聚合计算, 但是它不像普通聚合函数那样每组只返回一个值, 开窗函数可以为每组返回 ...