P1680题解

P1680题解

思路

一看这题,不就是组合题吗?再往下看,涉及到分组,一下子就想到了隔板法,只不过要想隔板还需要一点小处理:因为第 \(i\) 必须大于 \(C_{i}\),于是想到将 \(n\) 减去每组的 \(C_{i}\),于是奇怪的分组就转化为基础的组合题:\(n\) 个相同的球放入 \(m\) 个不同盒子里,不能为空,求方案数。

那脑子里就出现了答案:

\(C_{m-1}^{n-1}\bmod1000000007\)

而由我们小学学的组合知识可知:

\(C_{m}^{n}=\frac{n!}{m!(n-m)!}\)

于是设 \(p=n!\)\(q=m!(n-m)!\),则 \(C_{m}^{n}=\frac{p}{q}\)

我的方法就是先求出 \(1\sim1000005\) 内所有数的阶乘 \(\bmod 1000000007\),然后就可以不咋费时间地求出 \(p\)\(q\)

由于除法取模不能直接除并取模,所以答案应为 \(a\times b'\bmod 100000007\),此处的 \(b'\)\(b\) 在模 \(1000000007\) 意义下的逆元。因为 \(1000000007\) 是一个质数,所以求逆元时可以用费马小定理或者欧拉定理(我用的是费马小定理)。

总结

  1. 组合知识。
  2. 逆元。
  3. 费马小定理。
  4. 欧拉定理。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#define mod 1000000007
#define ll long long
using namespace std;
ll n,m,num[1000005]={1};
ll qpow(ll a, ll b){//快速幂 
	ll ans = 1;
	for(; b; b>>=1,a=a*a%mod)
		if(b&1) ans=ans*a%mod;
	return ans;
}
int zh(ll n, ll m){//求C(n,m) 
	ll cnt=(num[n-m]*num[m])%mod;
	return num[n]*qpow(cnt,mod-2)%mod;
}
int main(){
	for(int i=1; i<1000001; i++)//先算出阶乘
		num[i]=(num[i-1]*i)%mod;//不取模见祖宗 
	scanf("%lld %lld" ,&n,&m);
	for(int i=1; i<=m; i++){
		ll x;
		scanf("%lld",&x);
		n-=x;
	} 
	printf("%d\n",zh(n-1,m-1));
	return 0;
}

附(选看)

  1. 快速幂:

对于线性求解的问题,如果需要优化,很多时候可以考虑选用树形结构的数据结构或者分治思想,那样可以将算法时间复杂度从 \(O(n)\) 降低到 \(O(\log n)\)。这里我们考虑用分治思想。

\(a^b\bmod n\),其实很容易想到,若 \(b\) 是偶数,则 \(a^{b}=a^{\frac{b}{2}}\times a^{\frac{b}{2}}\);若 \(b\) 是奇数,则 \(a^{b}=a^{\lfloor\frac{b}{2}\rfloor}\times a^{\lfloor\frac{b}{2}\rfloor}\times a\)。即我们只要求出 \(a^{\frac{b}{2}}\),然后再通过一次乘法运算,即可求出 \(a^{b}\)。接着继续将 \(\frac{b}{2}\) 分成 \(\frac{b}{4}\)\(\frac{b}{8}\)……最终 \(b\) 会变成 \(1\),并且只需要 \(\log b\) 次就可以实现。这就是快速幂。

  1. 费马小定理:

\(p\) 是质数,则对于任意整数 \(a\),都有 \(a^{p}\equiv a \pmod p\)

  1. 欧拉定理:

若正整数 \(a\)\(n\) 互质,则 \(a^{\varphi(n)}\equiv1\pmod n\),其中 \(\varphi(n)\) 为欧拉函数。

欧拉定理的推论:

若正整数 \(a\)\(n\) 互质,则对于任意正整数 \(b\),有 \(a^{b} \equiv a^{b\bmod\varphi(n)}\pmod n\)

证明:

\(b=q\times \varphi(n)+r\),其中 \(0\leq r<\varphi(n)\),即 \(r=b\bmod \varphi(n)\)

于是:\(a^{b}\equiv a^{q\times \varphi(n)+r}\equiv (a^{\varphi(n)})^q\times a^r\equiv 1^q\times a^r\equiv a^r\equiv a^{b\bmod\varphi(n)} \pmod n\)

完结——如有错误请指出在哪里,是啥问题,谢谢!

posted @ 2025-01-29 15:26  naroto2022  阅读(21)  评论(0)    收藏  举报