View Code
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 }