Accept: 30 Submit: 94
Time Limit: 1000 mSec Memory Limit : 262144 KB
Problem Description
N wizards are attending a meeting. Everyone has his own magic wand. N magic wands was put in a line, numbered from 1 to n(Wand_i owned by wizard_i). After the meeting, n wizards will take a wand one by one in the order of 1 to n. A boring wizard decided to reorder the wands. He is wondering how many ways to reorder the wands so that at least k wizards can get his own wand.
For example, n=3. Initially, the wands are w1 w2 w3. After reordering, the wands become w2 w1 w3. So, wizard 1 will take w2, wizard 2 will take w1, wizard 3 will take w3, only wizard 3 get his own wand.
Input
First line contains an integer T (1 ≤ T ≤ 10), represents there are T test cases.
For each test case: Two number n and k.
1<=n <=10000.1<=k<=100. k<=n.
Output
For each test case, output the answer mod 1000000007(10^9 + 7).
Sample Input
Sample Output
1#include<cstdio> #include<vector> #include<iostream> const int mod = 1e9 + 7; const int maxn = 10005; typedef long long LL; using namespace std; LL dp[maxn]; LL inv[maxn]; int n,k; LL pri[maxn]; LL ni[maxn]; LL pow(LL a,int b) { LL ans=1,base=a; while (b>0) { if (b%2==1) ans=(base*ans)%mod; base=(base*base)%mod; b/=2; } return ans; } void s() //打表 { pri[0]=1; ni[0]=1; for (int i=1;i<=maxn ;i++) { pri[i]=pri[i-1]*i%mod; //N! ni[i]=pow(pri[i],mod-2); } } int main() { s(); int T; scanf("%d", &T); dp[0]=1,dp[1] = 0; for(int i = 2; i <= maxn; i++) { dp[i] = ((i - 1) * (dp[i - 1] + dp[i - 2])) % mod; } while(T--) { LL ans=1; scanf("%d%d", &n, &k); int cnt = n - k; if(cnt==0) { puts("1"); continue; } if(cnt==1) { puts("0"); continue; } for(int i=2;i<=cnt;i++) { LL sum=((pri[n]*ni[i]%mod)*ni[n-i])%mod; //printf("%lld\n",sum); ans+=(sum*dp[i])%mod; } printf("%lld\n",ans%mod); } return 0; }