组合数
题意
求对
取模的结果。
解法1
可以一项一项地求出每一项的值,再逐项加起来,求每一项的组合数可以用以下式子推出:
根据费马小定理
我们可以用快速幂求出一个数的乘法逆元,并用其实现除法。
时间复杂度:空间复杂度:
代码
class Solution { public: /** * * @param n long长整型 * @return long长整型 */ static const long long MOD = 1e9+7;//模数 long long qpow(long long a,long long b)//快速幂 { if(b==0)return 1; long long tmp=qpow(a,b>>1); tmp=tmp*tmp%MOD; if(b&1)tmp=tmp*a%MOD; return tmp; } long long combinatorial(long long n) { // write code here long long c=1;//C(n,0)=1 long long ans = 0; for(long long i=1;i<=n;i++) { c=c*(n-i+1)%MOD*qpow(i,MOD-2)%MOD; ans=(ans+i*c%MOD)%MOD; } return ans; } };
解法2
以上解法复杂度过高,无法通过所有测试数据。
由二项式定理:
令 ,得
上式对进行求导得
再令得
于是我们只需将对
取模只可。
时间复杂度:
空间复杂度:
代码
class Solution { public: /** * * @param n long长整型 * @return long长整型 */ static const long long MOD = 1e9+7;//模数 long long qpow(long long a,long long b)//快速幂 { if(b==0)return 1; long long tmp=qpow(a,b>>1); tmp=tmp*tmp%MOD; if(b&1)tmp=tmp*a%MOD; return tmp; } long long combinatorial(long long n) { // write code here return n%MOD*qpow(2,n-1)%MOD; } };