历年noip错题整理

FIRST. Noip2018普及组初赛错题

noip2018j T12:

设含有10个元素的集合的全部子集数为S,其中有7个元素组成的子集数为T,则T/S的值为()

A. 5/32
B. 15/128
C. 1/8
D. 21/128

\(T=C_{10}^7=C_{10}^3=\dfrac{10*9*8}{3*2*1}=120\)
\(S=C_{10}^1+C_{10}^2+C_{10}^3+......+C_{10}^{10}=1024\)

\(T/S=120/1024=5/128\)

故答案为B.


noip2018j T4

广域网的英文缩写是( )

A. LAN
B. WAN
C. MAN
D. LNA
广域网(WAN,Wide Area Network)也称远程网(long haul network )。通常跨接很大的物理范围,所覆盖的范围从几十公里到几千公里,它能连接多个城市或国家,或横跨几个洲并能提供远距离通信,形成国际性的远程网络。

局域网(LAN,Local Area Network)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能。

城域网(MAN,Metropolitan Area Network)是在一个城市范围内所建立的计算机通信网,属宽带局域网。

故答案为B.


noip2018j T14

为了统计一个非负整数的二进制形式中 1 的个数,代码如下:

int CountBit(int x)
{
	int ret = 0;
	while (x)
	{
		ret++;
		___________;
	}
	return ret;
}

A. x >>= 1
B. x &= x - 1
C. x |= x >> 1
D. x <<= 1

简单来说,当二进制数减1时,处在最后的一个位会减少1,如果这位本身就是1,那么直接变成0:
\(10101\)-->\(10100\);
但如果最后一个是0,那么套用从上一位借一个的原则;
\(10100\)-->\(10011\);
到这里我发现了,相当于从右往左的第一个1会让剩下的所有0再变成1;
相当于把这一个减的操作从这一个1处截断,应为当前是0时只会往上1位去借,那么这一位是1时往下借,后面一定全部是0
然后我们进行和原来一个数的与操作,就会使得这一个1连同其后的所有位变成0,而更高的位数不会受到影响.

故答案为B.


2018noipj T17

从 1 到 2018 这 2018 个数中,共有__________个包含数字 8 的数。
只有 1 个 8 :
_ _ _ 8:\(\quad2*9*9+2=164\)(个)
_ _ 8 _:\(\quad2*9*9=162\)(个)
共: \(164+162*162=488\)(个)

只有 2 个 8 :
_ _ 8 8: \(\quad2*9=18\)(个)
_ 8 8 _: \(\quad2*9=18\)(个)
_ 8 _ 8: \(\quad2*9=18\)(个)
共: \(18*3=54\)(个)

只有3个 8 :
_ 8 8 8: \(\quad2\)(个)
共: \(2个\)

共: \(488+2+54=544\)(个)
故答案为4.


2018noipj T19

阅读程序写结果

#include <stdio.h>
int main() {
	int x;
    scanf("%d", &x);
    int res = 0;
    for (int i = 0; i < x; ++i) {
      	if (i * i % x == 1) {
      		++res;
      	}
    }
    printf("%d", res);
    return 0;
}

输入:15
输出:__________

i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
\(i^2\) 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196
\(i^2mod 15\) 0 1 4 9 1 10 6 4 4 6 10 1 9 4 1
\(15^2\)以内的完全平方数有多少个模\(15\)\(1\),
故答案为4.

noip2018j T22

完善程序

(最大公约数之和)下列程序想要求解整数 𝑛 的所有约数两两之间最大公约数的和对 10007 求余后的值,试补全程序。
举例来说,4 的所有约数是\(1, 2, 4\)。1 和 2 的最大公约数为 1 ;2 和 4 的最大公约数为 2 ;1 和 4 的最大公约数为 1 。于是答案为1 + 2 + 1 = 4。

要求getDivisor 函数的复杂度为𝑂(√𝑛),gcd 函数的复杂度为𝑂(log max(𝑎, 𝑏))。

#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;
}
  1. \(\underline{i*i}\)
  2. \(\underline{n/i}\)
  3. \(\underline{return\;a}\)
  4. \(\underline{\qquad}\)
  5. \(\underline{ans+gcd(a[i],a[j])}\)

gcd就是辗转相除法!!,
故 ④ 就是\(a\%b\).


noip2018j T20

阅读程序写结果

#include <iostream>
using namespace std;
int n, m;

int findans(int n, int m) {
    if (n == 0) return m;
    if (m == 0) return n % 3;
    return findans(n - 1, m) - findans(n, m - 1) + findans(n - 1, m - 1);
}

int main(){
    cin >> n >> m;
    cout << findans(n, m) << endl;
    return 0;
}

输入:5 6
输出:________

n m 0 1 2 3 4 5 6
0 0 1 2 3 4 5 6
1 1 0 1 4 3 6 5
2 2 -1 2 3 4 5 6
3 0 1 0 5 6 7 8
4 1 0 1 4 7 6 9
5 2 -1 2 3 6 5 8
由上表可以得出:\(findans(5,6)=8\)
故答案为8.




SECOND. Noip2017普及组初赛错题


noip2017j T6

下列不属于面向对象程序设计语言的是( ).

A. C
B. C++
C. Java
D. C#

答案为A.


noip2017pj T14

若串 S = “copyright”,其子串的个数是( )。

A. 72
B. 45
C. 46
D. 36
\(1+2+3+4+5+6+7+8+9=45\)(个)
\(45+1=46\)(个)
故答案为C.


noip2017pj T17

设 A 和 B 是两个长为 n 的有序数组,现在需要将 A 和 B 合并成一个排好序的数组,任何以元素比较作为基本运算的归并算法在最坏情况下至少要做( )次比较。

A. \(n^2\)
B. n log n
C. 2n
D. 2n - 1


noip2017pj T23

阅读程序写结果:

#include<iostream>
using namespace std;
int main()
{
    int t[256];
    string s;
    int i;
    cin >> s;
    for (i = 0; i < 256; i++)
        t[i] = 0;
    for (i = 0; i < s.length(); i++)
        t[s[i]]++;
    for (i = 0; i < s.length(); i++)
        if (t[s[i]] == 1)
        {
            cout << s[i] << endl;
            return 0;
        }
    cout << "no" << endl;
    return 0;
}

输入:xyzxyw
输出:_________
请注意第\(17\)行有 return 0;
所以只会输出一个字母:z





THIRD. Noip2010普及组初赛错题

noip2010pj T3

以下逻辑表达式的值恒为真的是( )。
A. \(P∨(¬P∧Q)∨(¬P∧¬Q)\)
B. \(Q∨(¬P∧Q)∨(P∧¬Q)\)
C. \(P∨Q∨(P∧¬Q)∨(¬P∧Q)\)
D. \(P∨¬Q∨(P∧¬Q)∨(¬P∧¬Q)\)
答案为A.


noip2010pj T9

前缀表达式+ 3 * 2 + 5 12的值是( )。
A. 23
B. 25
C. 37
D. 65
前缀表达式用 来实现:每次遇到一个符号,就把栈顶的2个元素弹出做运算.
所以+ 3 * 2 + 5 12\(=\)3+2*(5+12)\(=\)3+2*17\(=\)37
故答案为C.

noip2010pj T14

在下列HTML语句中,可以正确产生一个指向NOI官方网站的超链接的是( )。

A. <a url="http://www.noi.cn">欢迎访问NOI网站</a>
B. <a href="http://www.noi.cn">欢迎访问NOI网站</a>
C. <a>http://www.noi.cn</a>
D. <a name="http://www.noi.cn">欢迎访问NOI网站</a>

href是Hypertext Reference的缩写。意思是指定超链接目标的URL。href 属性的值可以是任何有效文档的相对或绝对URL,包括片段标识符和JavaScript代码段。

故答案为B.


noip2010pj T18

关于拓扑排序,下面说法正确的是( )。
A. 所有连通的有向图都可以实现拓扑排序
B. 对同一个图而言,拓扑排序的结果是唯一的
C. 拓扑排序中入度为0的结点总会排在入度大于0的结点的前面
D. 拓扑排序结果序列中的第一个结点一定是入度为0的点
答案为D.


noip2010pj T19

完全二叉树的顺序存储方案,是指将完全二叉树的结点从上至下、从左至右依次存放到一个顺序结构的数组中。假定根结点存放在数组的1号位置,则第k号结点的父结点如果存在的话,应当存放在数组的( )号位置。
A. 2k
B. 2k+1
C. k/2下取整
D. (k+1)/2下取整
顺序储存方案:若一个结点的编号为\(k\),则其左子树的编号为\(2k\),右子树的编号为\(2k+1\)
\(\left\lfloor\dfrac{(2k+1)}{2}\right\rfloor\)\(=k\) \(2k/2=k\)

posted @ 2021-10-05 12:11  __xt  阅读(500)  评论(0)    收藏  举报