题目大意

给定\(n,r,k,p\)

\(1 \leq n \leq 10^9\)

\(0 \leq r,k \leq 50\)

\(2 \leq p \leq 2^{30}+1\)

\[ \left(\sum_{i=0}^\infty {C_{nk}^{ik+r}}\right) \ mod \ p \]

\[ (C_{nk}^{r}+C_{nk}^{k+r}+C_{nk}^{2k+r}+...+C_{nk}^{(n-1)k+r}+C_{nk}^{nk+r}+...) \ mod \ p \]

解题思路

根据\(C\)的另一个递推式:

\[ C_{i}^{j}=C_{i-1}^{j}+C_{i-1}^{j-1} \]

我们做一些改变

令\(dp_{i,j}\)表示取\(i\)个,取的个数模\(k\)余\(j\)的方案总数

递推式很类似:

\[ dp_{i,j}=dp_{i-1,j}+dp_{i-1,(j-1+k)\%k} \]

这个式子就可以矩阵乘法加速

\[ \left[ \begin{matrix} 1&0&0&0&\cdots&0&1 \\ 1&1&0&0&\cdots&0&0 \\ 0&1&1&0&\cdots&0&0 \\ 0&0&1&1&\cdots&0&0 \\ \vdots&\vdots&\vdots&\vdots&\ddots&\vdots&\vdots \\ 0&0&0&0&\cdots&1&1 \\ 1&0&0&0&\cdots&0&1 \end{matrix} \right] \left[ \begin{matrix} dp_{i-1,0} \\ dp_{i-1,1} \\ dp_{i-1,2} \\ dp_{i-1,3} \\ \vdots \\ dp_{i-1,k-2} \\ dp_{i-1,k-1} \end{matrix} \right] = \left[ \begin{matrix} dp_{i,0} \\ dp_{i,1} \\ dp_{i,2} \\ dp_{i,3} \\ \vdots \\ dp_{i,k-2} \\ dp_{i,k-1} \end{matrix} \right] \]

答案即为\(dp_{nk,r}\)(在\(nk\)个元素中取的个数模\(k\)余\(r\)的方案总和)

复杂度\(O(k^3lognk)\)

要注意一下,\(k=1\)的时候矩阵长这样:

\[ \left[ \begin{matrix} 2 \end{matrix} \right] \]

#include<iostream>
#include<cstdio>
#include<cstring>long long n,p,K,r;struct Matrix{long long M[100][100];Matrix(){memset(M,0,sizeof(M));}
};
Matrix operator * (Matrix &A,Matrix &B){Matrix ret;for (int i=0;i<K;i++)for (int j=0;j<K;j++)for (int k=0;k<K;k++){ret.M[i][j]+=A.M[i][k]*B.M[k][j];ret.M[i][j]%=p;}return ret;
}Matrix E,S;Matrix Fast_pow(Matrix &P,long long u){if (!u) return E;Matrix now=Fast_pow(P,u>>1);now=now*now;if (u&1) now=now*P;return now;
}int main(){scanf("%d%d%d%d",&n,&p,&K,&r);for (int i=0;i<K;i++){S.M[i][i]++;S.M[i][(i-1+K)%K]++;E.M[i][i]++;}S=Fast_pow(S,n*K);printf("%d",S.M[r][0]);
}

转载于:https://www.cnblogs.com/ytxytx/p/9480710.html

[SHOI2017]组合数问题相关推荐

  1. 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法

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

  2. Shoi2017试题泛做

    一口气做完六个省的省选(误) Day1 [Shoi2017]期末考试 枚举最大的天数,然后代价贪心地O(1)计算. 1 #include <cstdio> 2 #include <a ...

  3. 黑吉辽沪冀晋六省联考 2017 BZOJ 486848694870487148724873

    趁着网络上题解还不是很多,赶快怒写一发骗一下访问量 这套题在BZOJ上的题号是4868-4873. 感觉还不错,就是有一些题弄起来有一点小恶心-- 这套题的部分分给得都很多,很良心的QAQ BZOJ ...

  4. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

  5. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

  6. Codeforces Beta Round #95 (Div. 2) 部分解题报告 (dp,组合数,)

    做这样的比赛既考快速编码的能力,还有快速思维的能力.本人很弱,跌了rating..加油!!!.. 第一题上来就把题意理解错了..粗心啊..直接模拟着做就行:1:如果字符串全是大写字母就进行大小写转换: ...

  7. [CQOI2014]数三角形 组合数 + 容斥 + gcd

    推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...

  8. 多重集表示合json数据_计数DP(划分数,多重集组合数)

    划分数:把n个无区别的物品划分成不超过m组. dp[i][j]=j的i划分的总数. dp[i[j]=dp[i][j-i]+dp[i-1][j] 即:将j个物品分成i份,有两种情况:每份划分都大于等于1 ...

  9. bzoj 4871: [Shoi2017]摧毁“树状图”

    4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec  Memory Limit: 512 MB Submit: 53  Solved: 9 [Su ...

最新文章

  1. .NET(C#) Internals: 以一个数组填充的例子初步了解.NET 4.0中的并行(二)
  2. ReentrantLock实现原理深入探究
  3. GLUEscript(wxJavascript)
  4. readfile函数使用方法_1分钟学会LOOKUP函数,有网友说使用这个方法,初学者秒变大神...
  5. android的findviewbyid,Android开发中如何简化findViewById类型转换
  6. 统计学习方法+Python机器学习实践指南+强化学习精要:核心算法与Tensorflow实现+图解深度学习与神经网络从张量到TensorF实现+人工神经网络理论设计及应用+深度卷积网络:原理与实践
  7. dcn网络与公网_DCN网络安全分析
  8. 2021-03-06
  9. 定义一个长方形类,求周长和面积--学习笔记--16
  10. 大数据解读《旅行青蛙》崛起之谜
  11. 浏览器安全——Web页面安全浏览器网络安全(HTTPS)浏览器系统安全
  12. ssrender例子
  13. 计算机学院刘岗,刘岗-中国科学院大学-UCAS
  14. 海王小姐姐教你微信如何三步实现多开,win7 win 8 win10都可用
  15. tar.gz 与 tar.xz
  16. 【Android】【自动填充】自定义AutofillService(二):编写AutofillService代码
  17. php自定义apk安装包实例
  18. jai-codec等相关包的pom引入问题
  19. vscode主题背景插件_【vscode折腾系列】更换vscode背景图
  20. 极路由:互联网思维颠覆传统路由

热门文章

  1. Vulnhub靶机渗透之 RAVEN: 1
  2. SQL注入之布尔盲注——sql-lab第八关
  3. 【Let‘s Go】Go语言入门篇
  4. Docker部署ElasticSearch7.11.1并挂载+配置X-Pack设置帐号密码+Kibana7.11.1+IK插件
  5. PyTorch基础(15)-- torch.flatten()方法
  6. 汽车车牌识别系统(六)-- 项目中的各个文件解析
  7. STM32开发 -- 自动连接一个未保存过的WIFI
  8. java 控制 android_Java For Android - 流程控制
  9. Android处理崩溃的一些实践
  10. TensorFlow for Hackers - Part III