1. 程式人生 > >0081-開關燈

0081-開關燈

題目

開關燈
難度級別:A; 執行時間限制:1000ms; 執行空間限制:256000KB; 程式碼長度限制:2000000B
試題描述

禮堂有n盞燈(n<=5000),從1到n按順序對燈進行編號,初始時全部處於開啟狀態;有m個人(m<=1000)也從1到m依次編號。

第一個人(1號)將燈全部關閉,第二個人(2號)將編號為2的倍數的燈開啟,第三個人(3號)將編號為3的倍數的燈做了相反處理(即開啟的燈關閉,將關閉的燈開啟)。依照編號遞增順序,以後的人都和3號一樣,將自己編號倍數的燈做相反處理。

經過m個人操作最後有多少燈是開著的?輸出開著燈的個數。

輸入
一行兩個整數n和m
輸出
輸出開著的燈的數量。
輸入示例
4 3
輸出示例
3

分析

  此題仔細分析便能發現只要能用兩層迴圈一層迴圈人數,一層迴圈燈數,再判斷是否整除就行了。

  同時,直接通過bool型別陣列(開啟為1,關閉為0)可以很清晰地儲存燈的狀態。想要實現開的關,關的開,直接用1減去當前燈的狀態就行了(開啟為1,1-1=0,關閉為0,1-0=1)。

程式碼

#include<bits/stdc++.h>
using namespace std;
bool a[5005];
int n,m,ans;
int main()
{
	scanf("%d%d",&n,&m);
	memset(a,1,sizeof(a));//初始時全部處於開啟狀態
	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) if(!(j%i))/*按照題目要求開啟或關閉對應的燈。*/ a[j]=1-a[j];//用1減去當前的數,就能夠實現開啟的關閉,關閉的開啟。
	for(int i=1;i<=n;i++) if(a[i]) ans++;//統計開著的燈。
	printf("%d",ans);
	return 0;
}