ZZULIOJ-2316,开灯问题(模拟)

题目描述:

有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯 将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后开着的灯的数量是多少?  

输入: 

 输 入两个正整数n和k(k≤n≤100000),用空格隔开。

输出: 

输出开着的灯的数量。  

样例输入: 

5 3 

样例输出: 

程序代码: 

#include//好久不写万能头都快忘了!!! 
using namespace std;
#define MAXN 100001
int a[MAXN];
int main()
{
	int n,k;
	scanf("%d %d",&n,&k);
	memset(a,0,sizeof(a));//灯是灭的,初始为0 
	for(int i=1;i<=k;i++)
	{
		for(int j=i;j<=n;j+=i)//控制j的增量,省时间 
		{//从第i个人开始,依次增加i,确保是编号的倍数 
			a[j]=!a[j];//改变灯的状态,取反 
		}
	}
	int sum=0;
	for(int i=1;i<=n;i++)
		if(a[i])//统计 
			sum++;
	printf("%d\n",sum);
	return 0;
}

 

你可能感兴趣的:(#,模拟)