NOIP 提高组初赛 · NOIP 2009 提高组初赛试题 第 24 题

选择题 · 答案 5850 · 考点:一维数组、控制结构

← 整套速查表 NOIP 提高组初赛 全部真题

题目

#include <iostream>
using namespace std;
int main()
{
	int a[4],b[4];
	int i,j,tmp;
	for (i=0;i<4;i++)
		cin >> b[i];
	for (i=0;i<4;i++)
	{
		a[i]=0;
		for (j=0;j<=i;j++)
		{
			a[i]+=b[j];
			b[a[i]%4]+=a[j];
		}
	}
	tmp=1;
	for (i=0;i<4;i++)
	{
		a[i]%=10;
		b[i]%=10;
		tmp*=a[i]+b[i];
	}
	cout << tmp << endl;
	return 0;
}

输入:2 3 5 7 输出:_______________

答案:5850

考点

一维数组控制结构

解题思维

这题考的是对程序执行流程的精准模拟,特别是数组下标动态变化(a[i]%4)和累加过程中的数值传递。拿到题别急着算,先理清循环里a和b是怎么互相‘喂’数据的,画个表跟踪每一轮a[i]变成多少、b里哪个位置被加了多少,最后再算乘积。

常见错误

最容易栽跟头的是手动模拟时把下标搞错,比如把a[i]%4当成固定下标,或者在累加时把a[j]写成了a[i],导致b数组的值全跑偏。还有个隐形坑是最后取模前的累加值可能很大,直接算tmp会溢出,得先对每个a[i]和b[i]单独取模再相加相乘,很多人会漏掉这一步直接拿大数乘,结果肯定不对。另外,循环里b的下标是动态变的,很多人习惯以为b[0]到b[3]是独立存储的,其实b[a[i]%4]是在不断往同一个位置堆数据,这会让b数组的值剧烈变化,必须逐行盯紧。

详细解析(节选)

这道题考查的是对程序执行流程的精准模拟,特别是数组下标动态变化(a[i]%4)和累加过程中的数值传递。拿到题别急着算,先理清循环里a和b是怎么互相‘喂’数据的,画个表跟踪每一轮a[i]变成多少、b里哪个位置被加了多少,最后再算乘积。

输入是b=[2,3,5,7],a全清零。外层i从0到3,内层j从0到i,每次把a[i]加上b[j],然后再把a[j]加到b[a[i]%4]里。这步‘b[a[i]%4]+=a[j]’是坑点,因为a[i]刚被更新,它的值可能很大,取模后才作为下标,而且同一个下标可能被多次累加,必须逐行盯紧。

i=0时,a[0]=0,j=0:a[0]+=b[0]=2→a[0]=2;b[2%4]=b[2]+=a[0]=2→b[2]=5+2=7。此时a=[2,0,0,0],b=[2,3,7,7]。

i=1时,a[1]=0,j=0:a[1]+=b[0]=2→a[1]=2;b[2%4]=b[2]+=a[0]=2→b[2]=7+2=9。j=1:a[1]+=b[1]=3→a[1]=5;b[5%4]=b[1]+=a[1]=5→b[1]=3+5=8。此时a=[2,5,0,0],b=[2,8,9,7]。

i=2时,a[2]=0,j=0:a[2]+=b[0]=2→a[2]=2;b[2%4]=b[2]+=a[0]=2→b[2]=9+2=11。j=1:a[2]+=b[1]=8→a[2]=10;b[10%4]=b[2]+=a[1]=5→b[2]=11+5=16。j=2:a[2]+=b[2]=16→a[2]=26;b[26%4]=b[2]+=a[2]=26→b[2]=16+26=42。此时a=[2,5,26,0],b=[2,8,42,7]。

i=3时,a[3]=0,j=0:a[3]+=b[0]=2→a[3]=2;b[2%4]=b[2]+=a[0]=2→b[2]=42+2=44。j=1:a[3]+=b[1]=8→a[3]=10;b[10%4]=b[2]+=a[1]=5→b[2]=44+5=49。j=2:a[3]+=b[2]=49→a[3]=59;b[59%4]=b[3]+=a[2]=26→b[3]=7+26=33。j=3:a[3]+=b[3]=33→a[3]=92;b[92%4]=b[0]+=a[3]=92→b[0]=2+92=94。此时a=[2,5,26,92],b=[94,8,49,33]。

第二阶段把每个a[i]和b[i]对10取模:a=[2,5,6,2],b=[4,8,9,3]。然后tmp依次乘(a[i]+b[i]):(2+4)=6,(5+8)=13,(6+9)=15,(2+3)=5,6×13×15×5=5850。所以输出5850。

易错点:手动模拟时把下标搞错,比如把a[i]%4当成固定下标,或者在累加时把a[j]写成了a[i],导致b数组的值全跑偏。还有个隐形坑是最后取模前的累加值可能很大,直接算tmp会溢出,得先对每个a[i]和b[i]单独取模再相加相乘,很多人会漏掉这一步直接拿大数乘,结果肯定不对。另外,循环里b的下标是动态变的,很多人习惯以为b[0]到b[3]是独立存储的,其实b[a[i]%4]是在不断往同一个位置堆数据,这会让b数组的值剧烈变化,必须逐行盯紧。

控制结构这类题在题库里非常常见,429道题覆盖了所有级别,尤其是2023-2026这几年考得最猛,2023年81题、2024年138题、2025年160题、2026年45题,说明命题人特别喜欢挖这种‘看起来简单但细节多’的坑。一维数组更是高频考点,224道题里2023年27题、2024年48题、2025年55题、2026年59题,逐年递增,基本可以断定未来还会继续考这种动态下标+累加的组合。GESP五级、四级、三级、六级、七级、八级、NOIP提高组初赛、CSP入门级、NOIP普及组初赛都有分布,说明从入门到提高全覆盖。

预测:基于考频趋势,未来几年(2027-2028)这类‘数组下标动态变化+多重循环模拟’的题大概率还会出现在NOIP提高组初赛和GESP五级、六级中,命题人可能会换个输入规模(比如n=5或n=8)来增加难度,但核心思路不变——画表逐行跟踪。暂无足够依据预测具体年份,但方向明确:继续考模拟细节。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断