历年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;
}
- \(\underline{i*i}\)
- \(\underline{n/i}\)
- \(\underline{return\;a}\)
- \(\underline{\qquad}\)
- \(\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\)

浙公网安备 33010602011771号