Bzoj4870 [SXOI2017]组合数问题
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 155 Solved: 78
Description
.jpg)
Input
Output
Sample Input
Sample Output
HINT
Source
数学问题 组合数
震惊!考场上花式骗分竟然可以拿到80分!
正解:
这个东西当然没有什么既成的公式,需要用DP推公式,和平常的公式推DP正好反过来了。
发现这个式子的项覆盖了nk内所有%k==r的位置,那么可以考虑这个式子的组合意义——
在全部nk个物品中,选出任意个物品使得选出的物品数%k==r的方案数!
设f[考虑到第i个物品][选出数量%k==j]=方案数,于是变成了可以$O(n^3)$推出来的背包问题?
还可以更加简单粗暴,$f[2n][(i+j)%k]=\sum f[n][i]*f[n][j] $ $O(n^2 logn)$倍增出解。
/*by SilverN*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#define LL long long
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*-''+ch;ch=getchar();}
return x*f;
}
int n,P,k,r;
struct num{
int x[];
void init(){
memset(x,,sizeof x);
}
}f;
num calc(const num &a,const num &b){
num res;
res.init();
for(int i=;i<=k;i++)
for(int j=;j<=k;j++)
(res.x[(i+j)%k]+=(LL)a.x[i]*b.x[j]%P)%=P;
return res;
}
num ksm(num a,LL t){
num res;
res.init();res.x[]=;
while(t){
if(t&)res=calc(res,a);
a=calc(a,a);
t>>=;
}
return res;
}
int main(){
int i,j;
n=read();P=read();k=read();r=read();
f.x[]=;
f.x[%k]+=;
f=ksm(f,(LL)n*k);
// for(i=0;i<=k;i++)printf("%d\n",f.x[i]);
printf("%d\n",f.x[r]);
return ;
}
Bzoj4870 [SXOI2017]组合数问题的更多相关文章
- 【BZOJ4870】组合数问题(动态规划,矩阵快速幂)
[BZOJ4870]组合数问题(动态规划,矩阵快速幂) 题面 BZOJ 洛谷 题解 显然直接算是没法做的.但是要求的东西的和就是从\(nk\)个物品中选出模\(k\)意义下恰好\(r\)个物品的方案数 ...
- BZOJ4870 [Shoi2017]组合数问题 【组合数 + 矩乘】
题目链接 BZOJ4870 题解 \[ans = \sum\limits_{i = 0}^{\infty}{nk \choose ik + r} \pmod p\] 发现实际是求 \[ans = \s ...
- BZOJ4870: [Shoi2017]组合数问题
4870: [Shoi2017]组合数问题 Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ...
- BZOJ4870:[SHOI2017]组合数问题(组合数学,矩阵乘法)
Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 ...
- [BZOJ4870][Shoi2017]组合数问题 dp+矩阵乘
4870: [Shoi2017]组合数问题 Time Limit: 10 Sec Memory Limit: 512 MB Description Input 第一行有四个整数 n, p, k, r ...
- 【BZOJ4870】组合数问题(计数DP,快速幂)
题意: 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 思路:From http://blog.csdn.net/qq_33229466/artic ...
- bzoj4870: [Shoi2017]组合数问题(DP+矩阵乘法优化)
为了1A我居然写了个暴力对拍... 那个式子本质上是求nk个数里选j个数,且j%k==r的方案数. 所以把组合数的递推式写出来f[i][j]=f[i-1][j]+f[i-1][(j-1+k)%k].. ...
- 【BZOJ4870】组合数问题 [矩阵乘法][DP]
组合数问题 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description Input 第一行有四个整数 n ...
- [BZOJ4870][六省联考2017]组合数问题(组合数动规)
4870: [Shoi2017]组合数问题 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 748 Solved: 398[Submit][Statu ...
随机推荐
- python 项目配置虚拟环境
# Windows 环境1, 安装 Visual C++ 2015 Build Tools, 依赖.Net Framework 4.6, 安装包位置 ./tools/windows/visualcpp ...
- Why is setTimeout(fn, 0) sometimes useful?
http://stackoverflow.com/questions/779379/why-is-settimeoutfn-0-sometimes-useful jquery validation s ...
- Median of Two Sorted Arrays(hard)
题目要求: 有两个排序的数组nums1和nums2分别为m和n大小. 找到两个排序数组的中位数.整体运行时间复杂度应为O(log(m + n)). 示例: 我的方法: 分别逐个读取两个数组的数,放到一 ...
- lintcode-160-寻找旋转排序数组中的最小值 II
160-寻找旋转排序数组中的最小值 II 假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2). 你需要找到其中最小的元素. 数组中可能存在 ...
- 透过汇编另眼看世界之DLL导出函数调用
前言:我一直对DLL技术充满好奇,一方面是因为我对DLL的导入/导出机制还不是特别的了解,另一面是因为我发现:DLL技术在Windows平台下占有重要的地位,几乎所有的Win32 API都是以导出函数 ...
- iOS-Masonry用法
__weak typeof(self) weakSelf = self; UIView * tempView = [[UIView alloc]init]; NSInteger count = ;// ...
- linux查看资源占用情况
在Linux中查看占用空间大文件 查看当前目录总共占的容量.而不单独列出各子项占用的容量$ du -sh查看当前目录下一级子文件和子目录占用的磁盘容量.$ du -lh --max-depth=1结果 ...
- Ubuntu启用root账号登录系统
使用root账号登陆Ubuntu系统,实现起来本身没啥难度,运行passwd root即可,然后在/etc/ssh/sshd_config里面修改PermitRootLogin yes即可.不过研究的 ...
- do_group_exit函数
一个进程在sleep状态如何获取进程的调用栈 TASK_WAKEUPKILL状态 一个进程sleep了,我如何获取他的用户态栈,如何获取用户堆栈 如何在内核态打印用户态+内核态的栈? 确定上一个调用栈 ...
- centos7编译安装redis遇坑
编译redis时:make cc Command not found 原因分析:没有安装gcc,执行: yum install gcc 编译redis时:error: jemalloc/jemallo ...