签到题(组合数学)

签到题(组合数学)

传送门

看错题意,以为是 n n n位数。应该是长度为 n n n的数组.恰好 n − 1 n-1 n1个不同的数的方案数.

所以肯定有两个数相同。

首先选出这两个数的位置 C n 2 C_n^2 Cn2,再选出这个数是几 C n 1 = n C_n^1=n Cn1=n

再对剩下 n − 1 n-1 n1个数中选出 n − 2 n-2 n2个数 C n − 1 n − 2 = n − 1 C_{n-1}^{n-2}=n-1 Cn1n2=n1

再进行全排列 ( n − 2 ) ! (n-2)! (n2)!

综上 a n s = C n 2 × n ! ans=C_n^2\times n! ans=Cn2×n!

#include
using namespace std;
typedef long long ll;
const int N=1e5+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair
#define fi first
#define se second
ll fac[N];
int main(){
    ll n;
    fac[0]=1;
    for(int i=1;i<=1e5;i++) fac[i]=fac[i-1]*i%mod;
    while(cin>>n){
       cout<<n*(n-1)/2*fac[n]%mod<<endl;
    }
    return 0;
}

你可能感兴趣的:(组合数学)