0 of 2 Questions completed
Questions:
You have already completed the quiz before. Hence you can not start it again.
Quiz is loading…
You must sign in or sign up to start the quiz.
You must first complete the following:
0 of 2 Questions answered correctly
Your time:
Time has elapsed
You have reached 0 of 0 point(s), (0)
Earned Point(s): 0 of 0, (0)
0 Essay(s) Pending (Possible Point(s): 0)
22. (最大公约数之和)下列程序想要求解整数 n 的所有约数两两之间最大公约数的和对 10007 求余后的值,试补全程序。
举例来说,4 的所有约数是 1,2,4。1 和 2 的最大公约数为 1;2 和 4 的最大公约数为 2;1 和 4 的最大公约数为 1。
于是答案为 1 + 2 + 1 = 4。要求getDivisor
函数的复杂度为 ,gcd
函数的复杂度为 O(log max(a,b))。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <iostream> using namespace std; const int N = 110000, P = 10007; int n; int a[N], len; int ans; void getDivisor() { len = 0; for (int i = 1; ① <= n; ++i) if (n % i == 0) { a[++len] = i; if ( ② != i) a[++len] = n / i; } } } int gcd(int a, int b) { if (b == 0) { ③ ; } return gcd(b, ④ ); } int main() { cin >> n; getDivisor(); ans = 0; for (int i = 1; i <= len; ++i) { for (int j = i + 1; j <= len; ++j) { ans = ( ⑤ ) % P; } } cout << ans << endl; return 0; } |
填空位置 ①:
填空位置 ②:
填空位置 ③:
填空位置 ④:
填空位置 ⑤:
22. 对于一个 1 到 n 的排列 P(即 1 到 n 中每一个数在 P 中出现了恰好一次),令为第 i 个位置之后第一个比 值更大的位置,
如果不存在这样的位置,则 =n+1。举例来说,如果 n = 5 且 P 为 15423,则 q 为 2, 6, 6, 5, 6。
下列程序读入了排列 P,使用双向链表求解了答案。试补全程序。
数据范围 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <iostream> using namespace std; const int N = 100010; int n; int L[N], R[N], a[N]; int main() { cin >> n; for (int i = 1; i <= n; ++i) { int x; cin >> x; ① ; } for (int i = 1; i <= n; ++i) { R[i] = ② ; L[i] = i - 1; } for (int i = 1; i <= n; ++i) { L[ ③ ] = L[a[i]]; R[L[a[i]]] = R[ ④ ]; } for (int i = 1; i <= n; ++i) { cout << ⑤ << " "; } cout << endl; return 0; } |
填空位置 ①:
填空位置 ②:
填空位置 ③:
填空位置 ④:
填空位置 ⑤: