BZOJ 4870[HEOI2017]组合数问题

题面:

4870: [Shoi2017]组合数问题

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 484  Solved: 242
[Submit][Status][Discuss]

Description

Input

第一行有四个整数 n, p, k, r,所有整数含义见问题描述。

1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 ? 1

Output

一行一个整数代表答案。

Sample Input

2 10007 2 0

Sample Output

8

HINT

Source

黑吉辽沪冀晋六省联考

这题和组合数一点关系都没有!!!!!

将问题转化一下:

求从n*k个物品中选出被k除余数为r个物品的方案数。

令f[i][j]为前i个物品中选出j个的方案数

f[i][j]=f[i-1][j]+f[i-1][j-1]

变形后得到f[i+j][x+y]+=f[i][x]*f[j][y]然后就可以高高兴兴的矩阵快速幂了

时间复杂度O(k3log2n)

 1 #include<stdio.h>
 2 #include<string.h>
 3 using namespace std;
 4 #define LL long long
 5 int n,p,k,r;
 6 int add(int x,int y)
 7 {
 8     x+=y;
 9     return x>=k?x-k:x;
10 }
11 struct martix
12 {
13     int a[51];
14     martix()
15     {
16         memset(a,0,sizeof(a));
17     }
18     martix operator * (const martix&b) const
19     {
20         martix ans;
21         for(int i=0;i<k;i++)
22             for(int j=0;j<k;j++)
23                 ans.a[add(i,j)]=(ans.a[add(i,j)]+1LL*a[i]*b.a[j])%p;
24         return ans;
25     }
26 };
27 int main()
28 {
29     scanf("%d%d%d%d",&n,&p,&k,&r);
30     martix ans,x;
31     ans.a[0]=x.a[0]=1;
32     ++x.a[k==1?0:1];
33     for(LL i=1LL*n*k;i;i>>=1,x=x*x)
34         if(i&1)
35             ans=ans*x;
36     printf("%d",ans.a[r]);
37 }

BZOJ 4870

时间: 2024-10-06 15:51:26

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

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

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

bzoj 4870: [Shoi2017]组合数问题

Description Solution 考虑这个式子的组合意义: 从 \(n*k\) 个球中取若干个球,使得球的数量 \(\%k=r\) 的方案数 可以转化为 \(DP\) 模型,设 \(f[i][j]\) 表示前 \(i\) 个步,取得球的数量 \(\%k=j\) 的方案数 \(f[i][j]=f[i-1][j]+f[i-1][j-1]\) 发现这个东西就是杨辉三角(胡话,此题无关) 这样就可以做 \(O(k^3log)\) 了,并且可以过了 网上还有一种做法: 设 \(f[i*2][a+b

BZOJ 4870 组合数问题

嗯....这个式子很奇妙 化简是没有用的,考虑一个dp,答案能用这个式子表达. 于是dp[i][j]表示前i组物品选出%k=j个物品的方案数,然后矩阵加速转移. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long n,p,k,r,c[55][55]; struct matrix { long long

六省联考:组合数问题

4870: [Shoi2017]组合数问题 2017-09-03 Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 ? 1 Output 一行一个整数代表答案. INPUT_1 2 10007 2 0 INPUT_2 20 10007 20 0 OUT_1 8 OUT_2 176 并不知道这个是什么玄学(组合数),但是这个题并不是裸组合数,因为联考时用组合数递

bzoj4870 [Shoi2017]组合数问题

4870: [Shoi2017]组合数问题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 747  Solved: 397[Submit][Status][Discuss] Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 ? 1 Output 一行一个整数代表答案. Sample Input 2 10007

[BZOJ4870][SHOI2017]组合数问题(组合数动规)

4870: [Shoi2017]组合数问题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 748  Solved: 398[Submit][Status][Discuss] Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 Output 一行一个整数代表答案. Sample Input 2 10007

2017/07/25 杂题(完全不可做题(划去))选讲

先膜一发主讲人@Antileaf 真是核平的一天那--大脑已经被蹂躏的死去活来了-- cogs2421 简单的Treap 链接:http://cogs.pro/cogs/problem/problem.php?pid=2421 题意:什么都给你了,建出Treap,输出先序遍历顺序. 实际上只是用了Treap的原则建树--先按照数值大小排序,然后按照建立笛卡尔树方法,维护单调栈,最大的全扔到右儿子去即可. 1 #include<iostream> 2 #include<cstdio>

[BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】

题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 m 减去 Ai - 1 ,相当于将这一部分固定分给 xi,就转化为无限制的情况了. 如果有一些限制条件是 xi <= Ai 呢?直接来求就不行了,但是注意到这样的限制不超过 8 个,我们可以使用容斥原理来求. 考虑容斥:考虑哪些限制条件被违反了,也就是说,有哪些限制为 xi <= Ai 却是 xi

BZOJ 3129 [Sdoi2013]方程 不定方程解的个数+组合数取模

题意:链接 方法:不定方程解的个数+组合数取模 解析: 先看n1与n2的部分的限制. 对于后半部分的限制来说,我们直接减去An1+i?1就可以转化一下求正整数解. 但是前半部分呢? 跟上一道猴子那个很像. 所以我们容斥搞就行了. 但是这道题好像不好写的地方不在这? 这题TMD不就是礼物吗! 大组合数取模如何取? 请参见我<BZOJ 礼物>的题解. 另外吐槽题干 明明是X1+X2+-+Xn=m 并不是小于等于 代码: #include <cstdio> #include <cs