题意:求解——

$$(C^{r}_{nk}+C^{r+k}_{nk}+C^{r+2k}_{nk}+...+C^{r+(n-1)k}_{nk}+...)mod(P)$$

其中$C^{m}_{n}$表示从n中选m个的方案数

保证$1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^{30} − 1$

http://www.lydsy.com/JudgeOnline/problem.php?id=4870

一看r,k很小就很自然地想到矩阵快速幂;

然后枚举nk

一开始打算横着递推,处理出每个C,同时处理C的部分和,然而横着递推有问题;

最后发现竖着递推,直接处理C的部分和非常方便。

S(x,y)表示C(ik+x,y)的和,可以从S((x-1+k)%k,y-1)+S(x,y-1)得出;

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
LL P,N,K,R;
struct Matrix{
LL _[][];
};
Matrix operator * (Matrix a,Matrix b){
Matrix c;
int i,j,k;
memset(c._,,sizeof(c._));
for(i=;i<;i++)
for(k=;k<;k++)
if(a._[i][k])
for(j=;j<;j++)
if(b._[k][j])
(c._[i][j]+=(a._[i][k]*b._[k][j])%P)%=P;
return c;
}
Matrix x,ret;
void Sqr(LL );
int main()
{
int i;
scanf("%lld%lld%lld%lld",&N,&P,&K,&R);
for(i=;i<K;i++)
x._[(i-+K)%K][i]++,x._[i][i]++;
Sqr(N*K);
printf("%lld\n",ret._[][R]);
return ;
}
void Sqr(LL n){
int i;
for(i=;i<;i++)ret._[i][i]=;
while(n){
if(n&)
ret=ret*x;
n>>=,x=x*x;
}
}

存在的问题:
见到组合数就认为不可能在合理的时间内完成行间递推

最新文章

  1. tensorflow 一些好的blog链接和tensorflow gpu版本安装
  2. 面对bug和困难的心态
  3. 【转】Android Studio下加入百度地图的使用 (一)——环境搭建
  4. FTP多任务下载实现类
  5. GMT与UTC简介
  6. Struts2拦截器的应用
  7. Spring 中的 Bean 配置
  8. ExtJs布局之accordion,fit,auto
  9. yii2 AR需要注意的地方
  10. 如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测
  11. 多线程面试题系列(6):经典线程同步 事件Event
  12. springboot测试、打包、部署
  13. 博客系统typecho的安装与使用
  14. 9.Pod控制器概念和基本操作2
  15. springboot上传文件并检查图片大小与格式
  16. html5降龙十八掌-函数,对象,数组的练习
  17. UVaLive 4064 Magnetic Train Tracks (极角排序)
  18. docker运行中的container怎么修改之前run时的env
  19. (转) C++中成员初始化列表的使用
  20. firefox os 会不会是未来移动平板及电视之星

热门文章

  1. centOS 自动锁屏 解决办法
  2. 记录php漏洞--宇宙最强语言 PHP 爆出 DoS 漏洞,可以直接灌满 CPU
  3. ajax请求失败 chrome报错net::ERR_INCOMPLETE_CHUNKED_ENCODING 问题原因
  4. [JavaScript] 将字符串数组转化为整型数组
  5. C语言的组成 以及预编译
  6. CPU 分支预测
  7. 【Azure】Publish Error of &quot;%(TargetOSFamily.Identity)&quot; that evaluates to &quot;&quot; instead of a number
  8. SQL中存储过程和函数的区别
  9. PMP备考指南之相关事项介绍
  10. 数据库学习---SQL基础(一)