CSP考试
#include <stdio.h>
#define n 100000
#define N n + 1
int m;
int a[N], b[N], c[N], d[N];
int f[n], g[N];
void init()
{
f[1] = g[1] = 1;
for (int i = 2; i <= n; i++) {
if (!a[i]) {
b[m++] = i;
c[i] = 1, f[i] = 2;
d[i] = 1, g[i] = i + 1;
}
for (int j = 0; j < m && b[j] * i <= n; j++) {
int k = b[j];
a[i * k] = 1;
if (i % k == 0) {
c[i * k] = c[i] + 1;
f[i * k] = f[i] / c[i * k] * (c[i * k] + 1);
d[i * k] = d[i];
g[i * k] = g[i] * k + d[i];
break;
}
else {
c[i * k] = 1;
f[i * k] = 2 * f[i];
d[i * k] = g[i];
g[i * k] = g[i] * (k + 1);
}
}
}
}
int main()
{
init();
int x;
scanf("%d", &x);
printf("%d %d\n", f[x], g[x]);
return 0;
}假设输入的x是不超过1000的自然数,第24行的"f[i]/c[i*k]"可能存在无法整除而向下取整的情况。
#include <stdio.h>
#define n 100000
#define N n + 1
int m;
int a[N], b[N], c[N], d[N];
int f[n], g[N];
void init()
{
f[1] = g[1] = 1;
for (int i = 2; i <= n; i++) {
if (!a[i]) {
b[m++] = i;
c[i] = 1, f[i] = 2;
d[i] = 1, g[i] = i + 1;
}
for (int j = 0; j < m && b[j] * i <= n; j++) {
int k = b[j];
a[i * k] = 1;
if (i % k == 0) {
c[i * k] = c[i] + 1;
f[i * k] = f[i] / c[i * k] * (c[i * k] + 1);
d[i * k] = d[i];
g[i * k] = g[i] * k + d[i];
break;
}
else {
c[i * k] = 1;
f[i * k] = 2 * f[i];
d[i * k] = g[i];
g[i * k] = g[i] * (k + 1);
}
}
}
}
int main()
{
init();
int x;
scanf("%d", &x);
printf("%d %d\n", f[x], g[x]);
return 0;
}假设输入的x是不超过1000的自然数,在执行完init()后,f数组不是单调递增的,但g数组是单调递增的。
#include <stdio.h>
#define n 100000
#define N n + 1
int m;
int a[N], b[N], c[N], d[N];
int f[n], g[N];
void init()
{
f[1] = g[1] = 1;
for (int i = 2; i <= n; i++) {
if (!a[i]) {
b[m++] = i;
c[i] = 1, f[i] = 2;
d[i] = 1, g[i] = i + 1;
}
for (int j = 0; j < m && b[j] * i <= n; j++) {
int k = b[j];
a[i * k] = 1;
if (i % k == 0) {
c[i * k] = c[i] + 1;
f[i * k] = f[i] / c[i * k] * (c[i * k] + 1);
d[i * k] = d[i];
g[i * k] = g[i] * k + d[i];
break;
}
else {
c[i * k] = 1;
f[i * k] = 2 * f[i];
d[i * k] = g[i];
g[i * k] = g[i] * (k + 1);
}
}
}
}
int main()
{
init();
int x;
scanf("%d", &x);
printf("%d %d\n", f[x], g[x]);
return 0;
}假设输入的x是不超过1000的自然数,init函数的时间复杂度为( )。
#include <stdio.h>
#define n 100000
#define N n + 1
int m;
int a[N], b[N], c[N], d[N];
int f[n], g[N];
void init()
{
f[1] = g[1] = 1;
for (int i = 2; i <= n; i++) {
if (!a[i]) {
b[m++] = i;
c[i] = 1, f[i] = 2;
d[i] = 1, g[i] = i + 1;
}
for (int j = 0; j < m && b[j] * i <= n; j++) {
int k = b[j];
a[i * k] = 1;
if (i % k == 0) {
c[i * k] = c[i] + 1;
f[i * k] = f[i] / c[i * k] * (c[i * k] + 1);
d[i * k] = d[i];
g[i * k] = g[i] * k + d[i];
break;
}
else {
c[i * k] = 1;
f[i * k] = 2 * f[i];
d[i * k] = g[i];
g[i * k] = g[i] * (k + 1);
}
}
}
}
int main()
{
init();
int x;
scanf("%d", &x);
printf("%d %d\n", f[x], g[x]);
return 0;
}假设输入的x是不超过1000的自然数,在执行完init()后,f[1], f[2], f[3] ...... f[100]中有( )个等于2。
#include <stdio.h>
#define n 100000
#define N n + 1
int m;
int a[N], b[N], c[N], d[N];
int f[n], g[N];
void init()
{
f[1] = g[1] = 1;
for (int i = 2; i <= n; i++) {
if (!a[i]) {
b[m++] = i;
c[i] = 1, f[i] = 2;
d[i] = 1, g[i] = i + 1;
}
for (int j = 0; j < m && b[j] * i <= n; j++) {
int k = b[j];
a[i * k] = 1;
if (i % k == 0) {
c[i * k] = c[i] + 1;
f[i * k] = f[i] / c[i * k] * (c[i * k] + 1);
d[i * k] = d[i];
g[i * k] = g[i] * k + d[i];
break;
}
else {
c[i * k] = 1;
f[i * k] = 2 * f[i];
d[i * k] = g[i];
g[i * k] = g[i] * (k + 1);
}
}
}
}
int main()
{
init();
int x;
scanf("%d", &x);
printf("%d %d\n", f[x], g[x]);
return 0;
}假设输入的x是不超过1000的自然数,当输入"1000"时,输出为( )。
(Josephus问题)有n个人围城一个圈,依次标号0至n-1。从0号开始,依次0,1,0,1,...交替报数,报到1的人会离开,直至圈中只剩下一个人。求最后剩下人的编号。
试补全模拟程序。
#include <stdio.h>
const int MAXN = 1000000;
int F[MAXN];
int main() {
int n;
scanf("%d", &n);
int i =0, p = 0, c = 0;
while (①) {
if (F[i] == 0) {
if (②) {
F[i] = 1;
③;
}
④;
}
⑤;
}
int ans = -1;
for (i = 0; i < n; i++)
if (F[i] == 0)
ans = i;
printf("%d\n", ans);
return 0;
}①处应填( )
(Josephus问题)有n个人围城一个圈,依次标号0至n-1。从0号开始,依次0,1,0,1,...交替报数,报到1的人会离开,直至圈中只剩下一个人。求最后剩下人的编号。
试补全模拟程序。
#include <stdio.h>
const int MAXN = 1000000;
int F[MAXN];
int main() {
int n;
scanf("%d", &n);
int i =0, p = 0, c = 0;
while (①) {
if (F[i] == 0) {
if (②) {
F[i] = 1;
③;
}
④;
}
⑤;
}
int ans = -1;
for (i = 0; i < n; i++)
if (F[i] == 0)
ans = i;
printf("%d\n", ans);
return 0;
}②处应填( )
(Josephus问题)有n个人围城一个圈,依次标号0至n-1。从0号开始,依次0,1,0,1,...交替报数,报到1的人会离开,直至圈中只剩下一个人。求最后剩下人的编号。
试补全模拟程序。
#include <stdio.h>
const int MAXN = 1000000;
int F[MAXN];
int main() {
int n;
scanf("%d", &n);
int i =0, p = 0, c = 0;
while (①) {
if (F[i] == 0) {
if (②) {
F[i] = 1;
③;
}
④;
}
⑤;
}
int ans = -1;
for (i = 0; i < n; i++)
if (F[i] == 0)
ans = i;
printf("%d\n", ans);
return 0;
}③处应填( )
(Josephus问题)有n个人围城一个圈,依次标号0至n-1。从0号开始,依次0,1,0,1,...交替报数,报到1的人会离开,直至圈中只剩下一个人。求最后剩下人的编号。
试补全模拟程序。
#include <stdio.h>
const int MAXN = 1000000;
int F[MAXN];
int main() {
int n;
scanf("%d", &n);
int i =0, p = 0, c = 0;
while (①) {
if (F[i] == 0) {
if (②) {
F[i] = 1;
③;
}
④;
}
⑤;
}
int ans = -1;
for (i = 0; i < n; i++)
if (F[i] == 0)
ans = i;
printf("%d\n", ans);
return 0;
}④处应填( )
(Josephus问题)有n个人围城一个圈,依次标号0至n-1。从0号开始,依次0,1,0,1,...交替报数,报到1的人会离开,直至圈中只剩下一个人。求最后剩下人的编号。
试补全模拟程序。
#include <stdio.h>
const int MAXN = 1000000;
int F[MAXN];
int main() {
int n;
scanf("%d", &n);
int i =0, p = 0, c = 0;
while (①) {
if (F[i] == 0) {
if (②) {
F[i] = 1;
③;
}
④;
}
⑤;
}
int ans = -1;
for (i = 0; i < n; i++)
if (F[i] == 0)
ans = i;
printf("%d\n", ans);
return 0;
}⑤处应填( )
(矩形计数)平面上有n个关键点,求有多少个四条边都和x轴或者y轴平行的矩形,满足四个顶点都是关键点。给出的关键点可能有重复,但完全重合的矩形只计一次。
试补全枚举算法。
#include <stdio. h>
struct point {
int x, y, id;
};
int equals(struct point a, struct point b) {
return a.x == b.x && a.y == b.y;
}
int cmp(struct point a, struct point b) {
return ①;
}
void sort(struct point A[], int n) {
for (int i = 0; i < n; i++)
for (int j = 1; j < n; j++)
if (cmp(A[j], A[j - 1])) {
struct point t = A[j];
A[j] = A[j - 1];
A[j - 1] = t;
}
}
int unique(struct point A[], int n) {
int t = 0;
for(int i = 0; i < n; i++)
if (②)
A[t++] = A[i];
return t;
}
int binary_search(struct point А[], int n, int x, int y) {
struct point p;
p.x = x;
р.y = y;
p.id = n;
int a = 0,b = n - 1;
while (a < b) {
int mid = ③;
if (④)
a = mid + 1;
else
b = mid;
}
return equals(A[a], р);
}
#define MAXN 1000
struct point A[MAXN];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &A[i].x, &A[i].y);
A[i].id = i;
}
sort(A, n);
n = unique(A, n);
int ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (⑤ && binary_search(A, n, A[i].x, A[j].y) && binary_search(A, n, A[j].x, A[i].y)) {
ans++;
}
printf("%d\n", ans);
return 0;
}①处应填( )
(矩形计数)平面上有n个关键点,求有多少个四条边都和x轴或者y轴平行的矩形,满足四个顶点都是关键点。给出的关键点可能有重复,但完全重合的矩形只计一次。
试补全枚举算法。
#include <stdio. h>
struct point {
int x, y, id;
};
int equals(struct point a, struct point b) {
return a.x == b.x && a.y == b.y;
}
int cmp(struct point a, struct point b) {
return ①;
}
void sort(struct point A[], int n) {
for (int i = 0; i < n; i++)
for (int j = 1; j < n; j++)
if (cmp(A[j], A[j - 1])) {
struct point t = A[j];
A[j] = A[j - 1];
A[j - 1] = t;
}
}
int unique(struct point A[], int n) {
int t = 0;
for(int i = 0; i < n; i++)
if (②)
A[t++] = A[i];
return t;
}
int binary_search(struct point А[], int n, int x, int y) {
struct point p;
p.x = x;
р.y = y;
p.id = n;
int a = 0,b = n - 1;
while (a < b) {
int mid = ③;
if (④)
a = mid + 1;
else
b = mid;
}
return equals(A[a], р);
}
#define MAXN 1000
struct point A[MAXN];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &A[i].x, &A[i].y);
A[i].id = i;
}
sort(A, n);
n = unique(A, n);
int ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (⑤ && binary_search(A, n, A[i].x, A[j].y) && binary_search(A, n, A[j].x, A[i].y)) {
ans++;
}
printf("%d\n", ans);
return 0;
}②处应填( )
(矩形计数)平面上有n个关键点,求有多少个四条边都和x轴或者y轴平行的矩形,满足四个顶点都是关键点。给出的关键点可能有重复,但完全重合的矩形只计一次。
试补全枚举算法。
#include <stdio. h>
struct point {
int x, y, id;
};
int equals(struct point a, struct point b) {
return a.x == b.x && a.y == b.y;
}
int cmp(struct point a, struct point b) {
return ①;
}
void sort(struct point A[], int n) {
for (int i = 0; i < n; i++)
for (int j = 1; j < n; j++)
if (cmp(A[j], A[j - 1])) {
struct point t = A[j];
A[j] = A[j - 1];
A[j - 1] = t;
}
}
int unique(struct point A[], int n) {
int t = 0;
for(int i = 0; i < n; i++)
if (②)
A[t++] = A[i];
return t;
}
int binary_search(struct point А[], int n, int x, int y) {
struct point p;
p.x = x;
р.y = y;
p.id = n;
int a = 0,b = n - 1;
while (a < b) {
int mid = ③;
if (④)
a = mid + 1;
else
b = mid;
}
return equals(A[a], р);
}
#define MAXN 1000
struct point A[MAXN];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &A[i].x, &A[i].y);
A[i].id = i;
}
sort(A, n);
n = unique(A, n);
int ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (⑤ && binary_search(A, n, A[i].x, A[j].y) && binary_search(A, n, A[j].x, A[i].y)) {
ans++;
}
printf("%d\n", ans);
return 0;
}③处应填( )
(矩形计数)平面上有n个关键点,求有多少个四条边都和x轴或者y轴平行的矩形,满足四个顶点都是关键点。给出的关键点可能有重复,但完全重合的矩形只计一次。
试补全枚举算法。
#include <stdio. h>
struct point {
int x, y, id;
};
int equals(struct point a, struct point b) {
return a.x == b.x && a.y == b.y;
}
int cmp(struct point a, struct point b) {
return ①;
}
void sort(struct point A[], int n) {
for (int i = 0; i < n; i++)
for (int j = 1; j < n; j++)
if (cmp(A[j], A[j - 1])) {
struct point t = A[j];
A[j] = A[j - 1];
A[j - 1] = t;
}
}
int unique(struct point A[], int n) {
int t = 0;
for(int i = 0; i < n; i++)
if (②)
A[t++] = A[i];
return t;
}
int binary_search(struct point А[], int n, int x, int y) {
struct point p;
p.x = x;
р.y = y;
p.id = n;
int a = 0,b = n - 1;
while (a < b) {
int mid = ③;
if (④)
a = mid + 1;
else
b = mid;
}
return equals(A[a], р);
}
#define MAXN 1000
struct point A[MAXN];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &A[i].x, &A[i].y);
A[i].id = i;
}
sort(A, n);
n = unique(A, n);
int ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (⑤ && binary_search(A, n, A[i].x, A[j].y) && binary_search(A, n, A[j].x, A[i].y)) {
ans++;
}
printf("%d\n", ans);
return 0;
}④处应填( )
(矩形计数)平面上有n个关键点,求有多少个四条边都和x轴或者y轴平行的矩形,满足四个顶点都是关键点。给出的关键点可能有重复,但完全重合的矩形只计一次。
试补全枚举算法。
#include <stdio. h>
struct point {
int x, y, id;
};
int equals(struct point a, struct point b) {
return a.x == b.x && a.y == b.y;
}
int cmp(struct point a, struct point b) {
return ①;
}
void sort(struct point A[], int n) {
for (int i = 0; i < n; i++)
for (int j = 1; j < n; j++)
if (cmp(A[j], A[j - 1])) {
struct point t = A[j];
A[j] = A[j - 1];
A[j - 1] = t;
}
}
int unique(struct point A[], int n) {
int t = 0;
for(int i = 0; i < n; i++)
if (②)
A[t++] = A[i];
return t;
}
int binary_search(struct point А[], int n, int x, int y) {
struct point p;
p.x = x;
р.y = y;
p.id = n;
int a = 0,b = n - 1;
while (a < b) {
int mid = ③;
if (④)
a = mid + 1;
else
b = mid;
}
return equals(A[a], р);
}
#define MAXN 1000
struct point A[MAXN];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &A[i].x, &A[i].y);
A[i].id = i;
}
sort(A, n);
n = unique(A, n);
int ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (⑤ && binary_search(A, n, A[i].x, A[j].y) && binary_search(A, n, A[j].x, A[i].y)) {
ans++;
}
printf("%d\n", ans);
return 0;
}⑤处应填( )
在Linux系统终端中,用于列出当前目录下所含的文件和子目录的命令为( )。
二进制数001010102和000101102的和为( )。
在程序运行过程中,如果递归调用的层数过多,可能会由于( )引发错误。
以下排序方法中,( )是不稳定的。
以比较为基本运算,对于2n个数,同时找到最大值和最小值,最坏情况下需要的最小的比较次数为( )。