POJ 3761 not(思路+想法) 题

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 }

你可能感兴趣的:(poj)