#include<iostream> #include<algorithm> using namespace std; typedef unsigned long long ll; ll t; ll n; ll solve(int k, int n) { ll base = k; ll num = n; ll ans = 1; while (num > 0) { if (num & 1) { ans *= base; } base *= base; num >>= 1; } return ans; } int main() { cin >> t; while (t--) { cin >> n; int flag = 0; for (ll i = 3; i <= 100; i++) { ll l = 2, r = 1000; while (l <= r) { ll k = (l + r) / 2; ll s = (solve(k, i) - 1) / (k - 1); if (s < n) l = k + 1; else if (s > n)r = k - 1; else { flag = 1; break; } } } if (flag) cout << "YES" << endl; else cout << "NO" << endl; } system("pause"); return 0; }这串代码的时间复杂度是多少
时间: 2024-04-10 13:29:23 浏览: 62
#include <iostream>
这段代码的时间复杂度是O(t * logN * logM),其中t是测试用例的数量,N是输入的n值的最大范围,M是二分查找的范围(1000-2+1=999)。
代码中有一个外层循环,循环次数为t,所以时间复杂度中有一个因子t。
内层循环是一个二分查找,因此时间复杂度为O(logM)。内层循环中有一个嵌套的while循环,循环次数为logM,所以时间复杂度中有一个因子logM。
在二分查找的过程中,调用了solve函数进行计算。solve函数中有一个while循环,每次循环都将num右移1位,所以循环次数为logN,所以时间复杂度中有一个因子logN。
综上所述,整个代码的时间复杂度是O(t * logN * logM)。
阅读全文