bzoj P4870: [Shoi2017]组合数问题——solution
2024-08-28 01:26:58
题意:求解——
$$(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;
}
}
存在的问题:
见到组合数就认为不可能在合理的时间内完成行间递推
最新文章
- tensorflow 一些好的blog链接和tensorflow gpu版本安装
- 面对bug和困难的心态
- 【转】Android Studio下加入百度地图的使用 (一)——环境搭建
- FTP多任务下载实现类
- GMT与UTC简介
- Struts2拦截器的应用
- Spring 中的 Bean 配置
- ExtJs布局之accordion,fit,auto
- yii2 AR需要注意的地方
- 如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测
- 多线程面试题系列(6):经典线程同步 事件Event
- springboot测试、打包、部署
- 博客系统typecho的安装与使用
- 9.Pod控制器概念和基本操作2
- springboot上传文件并检查图片大小与格式
- html5降龙十八掌-函数,对象,数组的练习
- UVaLive 4064 Magnetic Train Tracks (极角排序)
- docker运行中的container怎么修改之前run时的env
- (转) C++中成员初始化列表的使用
- firefox os 会不会是未来移动平板及电视之星
热门文章
- centOS 自动锁屏 解决办法
- 记录php漏洞--宇宙最强语言 PHP 爆出 DoS 漏洞,可以直接灌满 CPU
- ajax请求失败 chrome报错net::ERR_INCOMPLETE_CHUNKED_ENCODING 问题原因
- [JavaScript] 将字符串数组转化为整型数组
- C语言的组成 以及预编译
- CPU 分支预测
- 【Azure】Publish Error of ";%(TargetOSFamily.Identity)"; that evaluates to ";"; instead of a number
- SQL中存储过程和函数的区别
- PMP备考指南之相关事项介绍
- 数据库学习---SQL基础(一)