ZZULIOJ-2316,开灯问题(模拟)
作者:互联网
题目描述:
有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯 将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后开着的灯的数量是多少?
输入:
输 入两个正整数n和k(k≤n≤100000),用空格隔开。
输出:
输出开着的灯的数量。
样例输入:
5 3
样例输出:
2
程序代码:
#include<bits/stdc++.h>//好久不写万能头都快忘了!!!
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;
}
Forever+Young 发布了279 篇原创文章 · 获赞 287 · 访问量 2万+ 私信 关注
标签:开着,2316,样例,ZZULIOJ,开灯,int,按下,MAXN,编号 来源: https://blog.csdn.net/weixin_43823808/article/details/104113393