1 //Result:wizmann 3761 Accepted 8576K 547MS G++ 912B
2 #include <cstdio>
3 #include <cstdlib>
4 #include <cstring>
5 #include <algorithm>
6 #include <iostream>
7
8 using namespace std;
9
10 #define print(x) cout<<x<<endl
11 #define input(x) cin>>x
12 #define K 1000010
13 #define MOD 20100713
14
15 long long mul[K];
16
17 void init()
18 {
19 mul[0]=1;
20 for(int i=1;i<K;i++)
21 {
22 mul[i]=(mul[i-1]*i)%MOD;
23 }
24 }
25
26 long long fastmod(long long a,long long b)//return (a^b)%MOD
27 {
28 if(b==0) return 1;
29 else if(b==1) return a%MOD;
30 else
31 {
32 long long t=fastmod(a,b/2);
33 t=(t*t)%MOD;//WA here,do MOD every step if possible
34 if(b&1) return (t*a)%MOD;
35 else return t;
36 }
37 }
38
39 /*
40 * 由冒泡排序的性质,每一次排序,对于每一个数x来说,逆序性质d(x)=d(x)-1
41 * 所以K=max(foreach d(x))
42 *
43 * 对于最小的数p,若使其逆序性质小于等于K,则有K+1种放置方法
44 * 对于次小数q,若同上,对于(2~N)数列,也有K+1种放置方法
45 * 所以方法数为(k+1)^(n-k),又由于k个数可以自由排列,乘上k!
46 * 得到结果F(n,k),即n个数,用少于K次排序可以完成的排列数
47 *
48 * 所以我们最终的答案就是F(n,k)-F(n,k-1)
49 * 优化后的式子为long long res=mul[k]*(fastmod(k+1,n-k)-fastmod(k,n-k));
50 *
51 * 总结:这玩意真不是人想的。。。- -。。。
52 * By Moody _"Kuuy"_ Wizmann @ 3^Nokia
53 *
54 * 2012-5-12 00:53AM
55 *
56 * I love Lisa.么么哒~
57 */
58
59
60
61 long long slove(int n,int k)
62 {
63 //printf("%lld %lld %lld\n",fastmod(k+1,n-k),fastmod(k,n-k),mul[k]);
64 long long res=mul[k]*(fastmod(k+1,n-k)-fastmod(k,n-k));
65 res%=MOD;
66 return res<0?res+MOD:res;
67 }
68
69 int main()
70 {
71 init();
72 int T,a,b;
73 input(T);
74 while(T--)
75 {
76 scanf("%d%d",&a,&b);
77 print(slove(a,b));
78 }
79 return 0;
80 }