题目描述:
有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; }