✏️ 纠错
第 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)