B-签到题
题意
n个数,生成一个长度为n的排列,并且有n-1种数,问有多少种方案。

思路
n个数,选择n-1种,也就是有1个数字不选,那么有n种方案。
对于每种方案,要从n-1个数里面,选择一个重复的数字,有n-1种方案。
此时对于每种方案,长度都是为n的序列,考虑多重集合的全排列方案数。因为只有一个数是出现了两次,所以方案数是n!/2
所以答案就是图片说明
图片说明

刚开始wa了一发,计算的结果是n*(n-1),考虑成了组合,而没有考虑长度为n的序列的不同排列也算不同方案。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll f[100005];
ll qpow(ll a,ll b){
    ll ans=1;
    while(b){
        if(b&1) ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return ans;
}
int main(){
    ll k=qpow(2,mod-2);
    f[0]=1;
    for(int i=1;i<=100000;i++){
        f[i]=f[i-1]*i%mod;
    }
    ll n;
    while(cin>>n) cout<<n*(n-1)%mod*f[n]%mod*k%mod<<endl;

    return 0;
}