#2143. 「SHOI2017」组合数问题

 

题目描述

组合数 Cnm\mathrm{C}_n^mC​n​m​​ 表示的是从 nnn 个互不相同的物品中选出 mmm 个物品的方案数。举个例子, 从 (1,2,3)(1, 2, 3)(1,2,3) 三个物品中选择两个物品可以有 (1,2)(1, 2)(1,2),(1,3)(1, 3)(1,3),(2,3)(2, 3)(2,3) 这三种选择方法。根据组合数的定义,我们可以给出计算组合数 Cnm\mathrm{C}_n^mC​n​m​​ 的一般公式:

Cmn=n!m! (n−m)!

其中 n!=1×2×⋯×nn! = 1 \times 2 \times \cdots \times nn!=1×2×⋯×n。(特别地,当 n=0n = 0n=0 时,n!=1n! = 1n!=1;当 m>nm > nm>n 时,Cnm=0\mathrm{C}_n^m = 0C​n​m​​=0。)

小葱在 NOIP 的时候学习了 Cij\mathrm{C}_i^jC​i​j​​ 和 kkk 的倍数关系,现在他想更进一步,研究更多关于组合数的性质。小葱发现,Cij\mathrm{C}_i^jC​i​j​​ 是否是 kkk 的倍数,取决于 Cjimodk 是否等于 000,这个神奇的性质引发了小葱对 mod\mathrm{mod}mod 运算(取余数运算)的兴趣。现在小葱选择了是四个整数 n,p,k,rn, p, k, rn,p,k,r,他希望知道

(∞∑i=0Cik+rnk)modp,

(Crnk+Ck+rnk+C2k+rnk+⋯+C(n−1)k+rnk+Cnk+rnk+⋯)modp

的值。

输入格式

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

输出格式

一行一个整数代表答案。

样例

样例输入 1

2 10007 2 0

样例输出 1

8

样例解释 1

C40+C42+C44+⋯=1+6+1=8\mathrm{C}_4^0 + \mathrm{C}_4^2 + \mathrm{C}_4^4 + \cdots = 1 + 6 + 1 = 8C​4​0​​+C​4​2​​+C​4​4​​+⋯=1+6+1=8。

样例输入 2

20 10007 20 0

样例输出 2

176

数据范围与提示

对于 30%30\%30% 的测试点,1≤n,k≤301 \leq n, k \leq 301≤n,k≤30,ppp 是质数;
对于另外 5%5\%5% 的测试点,p=2p = 2p=2;
对于另外 5%5\%5% 的测试点,k=1k = 1k=1;
对于另外 10%10\%10% 的测试点,k=2k = 2k=2;
对于另外 15%15\%15% 的测试点,1≤n≤103,1≤k≤501 \leq n \leq 10^3, 1 \leq k \leq 501≤n≤10​3​​,1≤k≤50,ppp 是质数;
对于另外 15%15\%15% 的测试点,1≤n×k≤1061 \leq n \times k \leq 10^61≤n×k≤10​6​​,ppp 是质数;
对于另外 10%10\%10% 的测试点,1≤n≤109,1≤k≤501 \leq n \leq 10^9, 1 \leq k \leq 501≤n≤10​9​​,1≤k≤50,ppp 是质数;
对于 100%100\%100% 的测试点,1≤n≤109,0≤r<k≤50,2≤p≤230−11 \leq n \leq 10^9, 0 \leq r < k \leq 50, 2 \leq p \leq 2^{30} - 11≤n≤10​9​​,0≤r<k≤50,2≤p≤2​30​​−1。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[][],n,p,k,r;
int main(){
scanf("%d%d%d%d",&n,&p,&k,&r);
f[][]=;
for(int i=;i<=n*k;i++)
for(int j=;j<k;j++){
if(j!=)f[i][j]=(f[i-][j]+f[i-][j-])%p;
else f[i][j]=(f[i-][j]+f[i-][j+k-])%p;
}
printf("%d",f[n*k][r]);
}

60分 暴力

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int P,K,R;
long long N;
struct matrix{
int n,m,a[][];
matrix(){memset(a,,sizeof(a));}
matrix operator * (const matrix &c)const{
matrix res;res.n=n;res.m=c.m;
for(int i=;i<n;i++)
for(int j=;j<c.m;j++)
for(int k=;k<m;k++)
res.a[i][j]=(res.a[i][j]+1LL*a[i][k]*c.a[k][j]%P)%P;
return res;
}
}a,b;
void Pow(matrix x,long long y){
while(y){
if(y&)
a=a*x;
x=x*x;
y>>=;
}
}
int main(){
cin>>N;
scanf("%d%d%d",&P,&K,&R);
N=1LL*N*K;
a.n=;a.m=K;a.a[][]=;
b.n=b.m=K;
for(int i=;i<K;i++)b.a[i][i]++,b.a[i][(i+)%K]++;
Pow(b,N);
printf("%d",a.a[][R]);
return ;
}

100分 矩阵快速幂优化dp

loj #2143. 「SHOI2017」组合数问题的更多相关文章

  1. LOJ #2145. 「SHOI2017」分手是祝愿

    题目链接 LOJ #2145 题解 一道画风正常的--期望DP? 首先考虑如何以最小步数熄灭所有灯:贪心地从大到小枚举灯,如果它亮着则修改它.可以求出总的最小步数,设为\(cnt\). 然后开始期望D ...

  2. LOJ #2141. 「SHOI2017」期末考试

    题目链接 LOJ #2141 题解 据说这道题可以三分(甚至二分)? 反正我是枚举的 = = 先将t和b数组排序后计算出前缀和, 然后枚举最晚的出成绩时间,每次可以O(1)直接计算调整到该时间所需的代 ...

  3. LOJ 2557 「CTSC2018」组合数问题 (46分)

    题目:https://loj.ac/problem/2557 第一个点可以暴搜. 第三个点无依赖关系,k=3,可以 DP .dp[ cr ][ i ][ j ] 表示前 cr 个任务.第一台机器最晚完 ...

  4. LOJ #2142. 「SHOI2017」相逢是问候(欧拉函数 + 线段树)

    题意 给出一个长度为 \(n\) 的序列 \(\{a_i\}\) 以及一个数 \(p\) ,现在有 \(m\) 次操作,每次操作将 \([l, r]\) 区间内的 \(a_i\) 变成 \(c^{a_ ...

  5. loj2143 「SHOI2017」组合数问题

    大傻逼题--就是求 \(nk\) 个元素选出一些元素,选出的元素的个数要满足模 \(k\) 余 \(r\),求方案数. 想到 \(\binom{n}{m}=\binom{n-1}{m-1}+\bino ...

  6. LOJ #6432. 「PKUSC2018」真实排名(组合数)

    题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...

  7. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  8. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  9. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

随机推荐

  1. Python数据库(三)-使用sqlalchemy创建表

    首先需要安装sqlalchemy根据所需情况调用数据库接口,对数据库进行操作pymysql:mysql+pymysql://<username>:<password>@< ...

  2. 五颜六色的记事本 Notepad2.cn

    这是一款五颜六色的记事本,支持同时五种颜色的标签录入,可随意切换. 考虑到使用者的用眼舒适度,特意采用颜色对比明显并且色调柔和的配色方案,选择通用的微软雅黑字体作为编辑字体,字体工整便于识别. 针对使 ...

  3. Java中弱引用、软引用、虚引用及强引用的区别

    Java中弱引用VS软引用 Java中有如下四种类型的引用: 强引用(Strong Reference) 弱引用(WeakReference) 软引用(SoftReference) 虚引用(Phant ...

  4. How to clear fmadm log or FMA faults log (ZT)

    Here are the step by step of clearing the FMA faults on most of Oracle/Sun server. Work perfectly on ...

  5. 监控和安全运维 1.6 nagios监控客户端-2

    6. 继续添加服务服务端 vim /etc/nagios/objects/commands.cfg 增加: define command{ command_name check_nrpe comman ...

  6. 【MySQL】20个经典面试题(转)

    原文链接:http://bbs.51cto.com/thread-1470880-1.html Part2:经典题目 1.MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联: 2.my ...

  7. Windows10更新后无限重启

    以安全模式进入系统,禁用或卸载显卡驱动. 重启后重新安装驱动.

  8. MyBatis总结六:resultMap详解(包含多表查询)

    简介: MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对 ...

  9. java 中的三种引用,强引用,软引用,弱引用

    StrongReference   前引用,不会被系统GC回收,系统宁愿跑出OOM异常也不会回收强引用 SoftReference  软引用,在系统内存不足的时候,会被GC回收 WeakReferen ...

  10. PHP trim() 函数

    定义和用法 trim() 函数从字符串的两端删除空白字符和其他预定义字符. 语法 trim(string,charlist) 参数 描述 string 必需.规定要检查的字符串. charlist 可 ...