poj 3761 bubble sort#排列组合
2012-08-02 03:45
239 查看
/** 题意,求含n个不同元素的排列恰好经过k趟冒泡排序变得有序。问原数组有多少种排列情况 解法: 首先,定义一个 f(x)表示在数组中位于元素x左面且大于x的个数。那么, 1,f(x) = 0 (x = 1,2,...,n)是最终有序的状态 2,f(x) <= n - x; 3,对于每趟冒泡排序,若f(x) != 0,则f(x)--; 比较好求的是经过不超过k趟冒泡的排列数g(k) 易知,k趟冒泡达到有序的充要条件是 max f(x) == k 所以 n - x <= k;即 x >= n - k时,x可以放在数组的任意位置。 把元素分为[1,n-k],[n-k+1,n],在n个位置中放好了前n-k个数后,后k个数的方法为k! 对于前n-k 个数挨个来看, 首先要是f(1) <= k,则1有k+1个位置可放,放好1后,由于1的位置对f(2)无影响, 2同样有k+1个位置可放... g(k) = (k+1)^(n-k) * k! 最终结果则为 g(k) - g(k-1) = k! * [(k + 1)^(n - k) - k^(n - k)]; */ #include <stdio.h> #define MOD 20100713 __int64 power(__int64 a,__int64 p,__int64 m) { __int64 ans = 1; while(p) { if(p&1) ans = ans * a % m; p >>= 1; a = a * a % m; } return ans; } __int64 fac[1000001] = {1}; int main() { for(int i = 1; i < 1000001; ++i) fac[i] = fac[i-1] * i % MOD; int t; __int64 n,k; scanf("%d",&t); while(t--) { scanf("%I64d%I64d",&n,&k); printf("%I64d\n",(power(k+1,n-k,MOD)-power(k,n-k,MOD) + MOD) % MOD * fac[k] % MOD); } return 0; }
相关文章推荐
- POJ 3761 Bubble Sort 快速幂取模+组合数学
- poj 3761 Panda's Birthday Present (数学公式推导~~推?)
- POJ3761 Bubble Sort
- POJ 3761 (组合计数)
- POJ 3761 Bubble Sort (用反序表分析排列数)
- POJ 3761 not(思路+想法) 题
- poj3761 bubble sort
- poj 3761 Bubble Sort
- POJ 3761 Bubble Sort (乘方取模)
- POJ 3761:Bubble Sort——组合数学
- POJ 3761 Bubble Sort(乘方取模)
- POJ 3761 Bubble Sort
- POJ 3761 Bubble Sort
- poj 3761
- poj 3761 Bubble Sort_快速幂
- poj 3761 Bubble Sort_快速幂
- poj 3761 反逆序数+快速取模+阶乘预处理
- 快速幂取模 POJ 3761 bubble sort
- POJ 3968|UVALive 4992|HDU 3761|UVA 1475|Jungle Outpost|二分|半平面交
- POJ 3761 Bubble Sort 冒泡排序的扩展