首先一看应该是组合数的问题,但我们选出m个数之后,其他的数就不能再排在它原本的位置,所以又需要错排求出方案数。
错牌公式递推式:
有d[2]=1,d[0]=1,d[1]=0。d[i]=(i-1)*(d[i-1]+d[i-2])
又由乘法原理可得出总方案数。
注意:阶乘,逆元,错排都要预处理出来,否则T到飞起。
未预处理代码:
#includeusing namespace std;const int maxn=1e6+7;int T;long long n,m;long long d[maxn];const int mod=1e9+7;long long ksm(long long a,long long b){ long long base=1; while(b){ if(b&1) base=base*a%mod; b>>=1; a=a*a%mod; } return base;}long long C(long long n,long long m){ if(n
预处理过后:
#includeusing namespace std;const int maxn=1e6+7;int T;long long n,m;long long d[maxn];long long inv[maxn];long long f[maxn];const int mod=1e9+7;long long ksm(long long a,long long b){ long long base=1; while(b){ if(b&1) base=base*a%mod; b>>=1; a=a*a%mod; } return base;}long long C(long long n,long long m){ if(n