首页 > 其他分享 >[六省联考 2017] 组合数问题 题解

[六省联考 2017] 组合数问题 题解

时间:2023-02-25 14:33:24浏览次数:45  
标签:nk 六省 题解 leq vector base res 联考 mod

题目描述

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

\[C_n^m = \frac {n!} {m! \ (n - m)!} \]

其中 \(n! = 1 \times 2 \times \cdots \times n\)。(特别地,当 \(n = 0\) 时,\(n! = 1\);当 \(m > n\) 时,\(C_n^m = 0\)。)

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

\[\left( \sum_{i = 0}^\infty C_{nk}^{ik + r} \right) \bmod p, \]

\[\left( C_{nk}^{r} + C_{nk}^{k + r} + C_{nk}^{2k + r} + \cdots + C_{nk}^{(n - 1)k + r} + C_{nk}^{nk + r} + \cdots \right) \bmod p \]

的值。
对于 \(100\%\) 的测试点,\(1 \leq n \leq 10^9, 0 \leq r < k \leq 50, 2 \leq p \leq 2^{30} - 1\)。

题解

所求即为

\[\sum\limits_{i\ mod\ k=r}\binom{nk}{i}=\sum\limits_{i\ mod\ k=r}[x^i](1+x)^{nk}=[x^r]((1+x)^{nk}\ mod\ (x^k-1)) \]

循环卷积一下,做完了。

代码:

#include<bits/stdc++.h>
#define For(i,l,r) for(int i=(l);i<=(r);++i)
typedef long long ll;
using namespace std;
int n,p,k,r;
vector<ll> operator * (vector<ll> &f,vector<ll> &g)
{
	vector<ll> res;
	res.resize(k);
	For(i,0,k-1)
		res[i]=0;
	int len_f=f.size()-1,len_g=g.size()-1;
	For(i,0,len_f)
	{
		For(j,0,len_g)
			(res[(i+j)%k]+=(f[i]*g[j]))%=p;
	}
	return res;
}
vector<ll> qpow(vector<ll> a,ll b)
{
	vector<ll> res;
	res.resize(k);
	For(i,1,k-1)
		res[i]=0;
	res[0]=1;
	while(b)
	{
		if(b&1)
			res=res*a;
		a=a*a;
		b>>=1;
	}
	return res;
}
int main()
{
	scanf("%d%d%d%d",&n,&p,&k,&r);
	ll tmp=n;
	tmp*=(1ll*k);
	vector<ll> base;
	base.resize(k);
	For(i,2,k-1)
		base[i]=0;
	if(k==1)
	{
		base[0]=2;
		base[0]%=p;
	}
	else if(k!=1)
	{
		base[0]=1;
		base[1]=1;
	}
	vector<ll> ans=qpow(base,tmp);
	printf("%lld",ans[r]);
	return 0;
}

标签:nk,六省,题解,leq,vector,base,res,联考,mod
From: https://www.cnblogs.com/llzer/p/17154356.html

相关文章

  • 2.25 校内模拟赛 题解
    好消息:签到题首杀。坏消息:只会签到题。\(\text{contestid:726}\)A.随机\(\text{problemid:2307}\)B.回文路径\(\text{problemid:3772}\)成功首杀。看到回......
  • AtCoder Beginner Contest 282 A-F 题解
    比赛链接A-GeneralizedABC额,对,是的,没错,先这样再那样然后这样就是这样。点击查看代码#include<cstdio>intn;intmain(){ scanf("%d",&n); for(inti=0;......
  • #68. 「NOIP2004」津津的储蓄计划 题解
    #68.「NOIP2004」津津的储蓄计划题解题目传送门题目知识点模拟题目分析非常的“明显”,这是一道模拟题。题意说明有可能在某个月的月初,津津手中的钱加上这个月妈妈......
  • #119. 最大整数 题解
    #119.最大整数题解题目传送门题目知识点字符串+贪心题意说明设有n个正整数(n<=20),将它们连接成一排,组成一个最大的多位整数。(题目简介明了,一看就是出题人懒得写题目背......
  • #160. 「NOIP2004 普及组」不高兴的津津 题解
    #160.「NOIP2004普及组」不高兴的津津题解题目传送门题目知识点枚举题意说明津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为......
  • #373. 「USACO1.1」Friday the Thirteenth 题解
    #373.「USACO1.1」FridaytheThirteenth题解题目传送门题目知识点模拟+数学闰年知识点题意说明写一个程序来计算在n年里13日落在星期一,星期二......星期日的次数......
  • match 题解
    题面题目描述一个匹配模式是由一些小写字母和问号组成的一个字符串。当一个由小写字母组成的字符串\(s\),长度和匹配模式长度相同,并且在对应的每一位都相等或模式串相应......
  • 题解 Codeforces 1746F Kazaee
    题意给定长度为\(n\)的数组\(a\),和\(q\)次操作,支持:给定\(i,x\),修改\(a_i\)为\(x\)给定\(l,r,k\),查询\([l,r]\)中是否每个数的出现次数都是\(k\)的倍数......
  • 题解 LOJ P2393 「JOISC 2017 Day 2」门票安排
    题意咕咕咕。题解这题太神了,无限膜拜p_b_p_b,搬运一波题解。首先考虑二分。题意等价于选一些区间进行反转。首先注意到反转的区间两两有交,不然不反转一定更优。设反转......
  • P8822 [传智杯#3 初赛] 课程报名 题解
    题目传送门题目大意有一种课程,初始定价为\(v\)元;每报名\(m\)个学员,课程的定价就要提升\(a\)元,一共有\(n\)个学员报名。解题思路因为一共有\(n\)个学员报名,所......