✏️ 纠错
第 162 题 / 共 201 题
第11题 下面 count_triple函数的时间复杂度为( )。
int gcd(int a, int b) {
    if (a == 0)
        return b;
    return gcd(b % a, a);
}
int count_triple(int n) {
    int cnt = 0;
    for (int v = 1; v * v * 4 <= n; v++)
        for (int u = v + 1; u * (u + v) * 2 <= n; u += 2)
            if (gcd(u, v) == 1) {
                int a = u * u - v * v;
                int b = u * v * 2;
                int c = u * u + v * v;
                cnt += n / (a + b + c);
            }
    return cnt;
}
📝 题目解析

答案:C

考纲知识点:复杂度

解析:

count_triple函数功能:

统计某种三元组的数量;两层嵌套循环遍历变量v和u,对每对(u, v),调用gcd(u, v) 判断是否互质,若互质,则计算三元组并累加计数;

外层循环(v的范围):条件为v * v * 4 <= n,即v <= sqrt(n/4),因此v的遍历次数为O(√n)。

内层循环(u的范围):条件为u * (u + v) * 2 <= n,且u从v+1开始、步长为2递增。当v固定时,u的最大值近似为 √(n/2),看作O(√n)。

gcd函数时间复杂度为O(log min(a, b)),在最坏情况下可视为O(log n)(因u和v均不超过 √n)。

4.总时间复杂度

外层循环:O (√n),内层循环:O (√n)(对每个v),每次循环内的gcd操作:O (log n)

总时间复杂度为O(√n × √n × log n) = O(n log n)