K - Insertion Sort

本文深入解析了在VJudge平台上的一次竞赛代码,通过代码片段展示了如何使用C++解决复杂数学问题,包括大数运算、组合数学中的阶乘计算及模运算等。文章通过具体的编程实例,介绍了如何在给定的限制条件下,计算特定数学表达式的值。

https://vjudge.net/contest/278754#problem/K

#include<cstdio>
#define ll unsigned long long
using namespace std;
const int mod = 1e9+7;
ll t,ii,i,n,k,ans,sum,q,now;
int main()
{
    scanf("%llu",&t);
    for (ii=1; ii<=t; ii++)
    {
        scanf("%llu%llu%llu",&n,&k,&q);
        if(n < k)
        {
            ans = 1;
            for(i = 1; i <= n; i++)
                ans = ans*i%q;
            printf("Case #%llu: %llu\n",ii,ans);
            continue;
        }
        ans = 1;
        for(i = 1; i <= k; i++)
            ans = ans*i%q;
        now = (n-k-1+q)%q;
        sum = 1+now*now%q;
        sum%=q;
        sum=sum+(k*(((n-k)%q+q)%q)%q)%q;
        sum=(sum+(n-k-1))%q;
        ans=ans*sum%q;
        printf("Case #%llu: %llu\n",ii,ans);
    }
}

 

05-29
### 排序算法的分类与技术 排序算法可以根据其工作原理分为两大类:基于比较的排序算法和非基于比较的排序算法[^1]。基于比较的排序算法通过逐一比较元素来确定顺序,例如插入排序、冒泡排序和希尔排序[^2]。这些算法的时间复杂度通常为 \(O(n^2)\),因此在处理大规模数据时效率较低[^2]。 非基于比较的排序算法则不依赖于元素之间的直接比较,而是通过特定的数据结构或方法实现排序,如计数排序、基数排序和桶排序。这些算法在特定条件下可以达到线性时间复杂度 \(O(n)\),但它们的应用场景较为有限,通常要求输入数据具有某些特性(如整数范围较小)。 以下是几种常见的排序算法及其特点: #### 插入排序 插入排序是一种直观的排序方法,类似于人们在整理手牌时的操作[^4]。它通过将每个元素插入到已排序部分的正确位置来逐步构建有序列表。尽管其最坏情况下的时间复杂度为 \(O(n^2)\),但在接近有序的数据集上表现良好。 ```python def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and key < arr[j]: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr ``` #### 快速排序 快速排序是一种分治法的排序算法,通过选择一个“基准”元素将数组划分为两个子数组,然后递归地对子数组进行排序[^5]。它的平均时间复杂度为 \(O(n \log n)\),但在最坏情况下可能退化为 \(O(n^2)\)。 ```python def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` #### 计数排序 计数排序是一种非基于比较的排序算法,适用于数据范围较小的情况。它通过统计每个值出现的次数来构建排序结果,时间复杂度为 \(O(n + k)\),其中 \(k\) 是数据的最大值[^1]。 ```python def counting_sort(arr): max_val = max(arr) count = [0] * (max_val + 1) for num in arr: count[num] += 1 sorted_arr = [] for i, cnt in enumerate(count): sorted_arr.extend([i] * cnt) return sorted_arr ``` ### 总结 排序算法的选择取决于具体应用场景。对于小规模或接近有序的数据集,插入排序可能是合适的选择;而对于大规模数据集,快速排序或非基于比较的排序算法(如计数排序)通常更高效[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值