Link:

传送门

Solution:

组合数的式子都可以先想想能不能递推,写出来就是:

$\sum C_{n*k}^{i*k+r}=\sum C_{n*k-1}^{i*k+r}+\sum C_{n*k-1}^{i*k+r-1}$

如果将每个求和看成一个整体,设$dp[n][r]=\sum C_{n}^{i*k+r}$,

则有$dp[n][r]=dp[n-1][r]+dp[n-1][(r-1+k)modk]$

由于$r$就相当于余数因此0-1后要变为$k-1$!

这样的递推式明显可以矩乘,直接上的话就是:

$新列向量=n*n矩阵\times 原列向量$,第$i$行将$s[i][i],s[i][(i-1+k)modk]$置1即可

不过注意这是一个循环矩阵,那么其实只要计算第一列,其他列都是其转动的结果

对于某一列有贡献的只有$n^2$个乘积,如果将每一对都转化成第一列的坐标发现是:

$s[k]=\sum_i \sum_j [(i+j)modn==k]s[i]*s[j]$ (下标从0开始) 

而之所以$答案列向量\times 第一列$也是这个式子感觉要从算贡献来考虑,可能是个巧合?

Code:

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=;
int n,p,r,k,res[MAXN],a[MAXN],t[MAXN]; void mul(int *x,int *y)
{
memset(t,,sizeof(t));
for(int i=;i<=k;i++)
for(int j=;j<=k;j++)
(t[(i+j)%k]+=1ll*x[i]*y[j]%p)%=p;
for(int i=;i<=k;i++) x[i]=t[i];
} int main()
{
scanf("%d%d%d%d",&n,&p,&k,&r);
res[]=;a[]++;a[%k]++; for(ll idx=1ll*n*k;idx;idx>>=,mul(a,a))
if(idx&) mul(res,a);
printf("%d",res[r]);
return ;
}

[BZOJ 4870] 组合数问题的更多相关文章

  1. bzoj 4870: [Shoi2017]组合数问题 [矩阵乘法优化dp]

    4870: [Shoi2017]组合数问题 题意:求 \[ \sum_{i=0}^{n-1} \binom{nk}{ik+r} \mod p \] \(n \le 10^9, 0\le r < ...

  2. bzoj 4870: [Shoi2017]组合数问题

    Description Solution 考虑这个式子的组合意义: 从 \(n*k\) 个球中取若干个球,使得球的数量 \(\%k=r\) 的方案数 可以转化为 \(DP\) 模型,设 \(f[i][ ...

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

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

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

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

  5. bzoj 4737: 组合数问题

    Description 组合数C(n,m)表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3)三个物品中选择两个物品可以有( 1,2),(1,3),(2,3)这三种选择方法.根据组合数 ...

  6. BZOJ 4517 组合数+错排

    思路: 预处理错排 然后C(n,m)*s[n-m-1]就是答案了 特判n-m-1<0 //By SiriusRen #include <cstdio> using namespace ...

  7. [UOJ 275/BZOJ4737] 【清华集训2016】组合数问题 (LUCAS定理的运用+数位DP)

    题面 传送门:UOJ Solution 这题的数位DP好蛋疼啊qwq 好吧,我们说回正题. 首先,我们先回忆一下LUCAS定理: \(C_n^m \equiv C_{n/p}^{m/p} \times ...

  8. 六省联考2017 Day1

    目录 2018.3.18 Test T1 BZOJ.4868.[六省联考2017]期末考试 T2 T3 BZOJ.4870.[六省联考2017]组合数问题(DP 矩阵快速幂) 总结 考试代码 T1 T ...

  9. Week One

    2018.11.21: 1.[BZOJ 4868][SHOI 2017] 从后往前枚举最后位置即可,如果$A<B$,用尽可能多的$A$替换$B$操作 Tip:很大的$C$可能爆$longlong ...

随机推荐

  1. [JL]最后的晚餐 动态规划(DP) codevs5318

    [JL]最后的晚餐 TimeLimit:1000MS  MemoryLimit:1000KB 64-bit integer IO format:%lld Problem Description [题库 ...

  2. 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重

    Java API提供的集合框架中Set接口下的集合对象默认是不能存储重复对象的,这里的重复判定是按照对象实例句柄的地址来判定的,地址相同则判定为重复,地址不同不管内容如何都判定为不重复,这有时与需求不 ...

  3. linux音频alsa-uda134x驱动文档阅读之一转自http://blog.csdn.net/wantianpei/article/details/7817293

    前言 目前,linux系统常用的音频驱动有两种形式:alsa oss alsa:现在是linux下音频驱动的主要形式,与简单的oss兼容.oss:过去的形式而我们板子上的uda1341用的就是alsa ...

  4. plupload 上传组件的使用

    在这之前在感谢园子好多大牛的文章,在这里就不列出来了. 进入正题. svn检索https://github.com/moxiecode/plupload 获取到代码,这篇文章使用的是v2.1.8 主要 ...

  5. Web测试技术要领

    基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战.基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否 ...

  6. 在Mac上搭建ReactNative开发环境

    1.安装Homebrew,   Mac系统的包管理器,用于安装NodeJS和一些其他必需的工具软件. /usr/bin/ruby -e "$(curl -fsSL https://raw.g ...

  7. tf.nn.embedding_lookup函数

    tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None, validate_indices=True, max_ ...

  8. 经典面试题:js继承方式下

    上一篇讲解了构造函数的继承方式,今天来讲非构造函数的继承模式. 一.object()方法 json格式的发明人Douglas Crockford,提出了一个object()函数,可以做到这一点. fu ...

  9. Java容器---Set: HashSet & TreeSet & LinkedHashSet

    1.Set接口概述        Set 不保存重复的元素(如何判断元素相同呢?).如果你试图将相同对象的多个实例添加到Set中,那么它就会阻止这种重复现象. Set中最常被使用的是测试归属性,你可以 ...

  10. SCTP客户端与服务器

    /** * @brief - Send a message, using advanced SCTP features * The sctp_sendmsg() function allows you ...