- 灯泡开关
初始时有 n 个灯泡处于关闭状态。
对某个灯泡切换开关意味着:如果灯泡状态为关闭,那该灯泡就会被开启;而灯泡状态为开启,那该灯泡就会被关闭。
第 1 轮,每个灯泡切换一次开关。即,打开所有的灯泡。
第 2 轮,每两个灯泡切换一次开关。 即,每两个灯泡关闭一个。
第 3 轮,每三个灯泡切换一次开关。
第 i 轮,每 i 个灯泡切换一次开关。 而第 n 轮,你只切换最后一个灯泡的开关。
找出 n 轮后有多少个亮着的灯泡。
示例 1:
输入:n = 3
输出:1
解释:
初始时, 灯泡状态 [关闭, 关闭, 关闭].
第一轮后, 灯泡状态 [开启, 开启, 开启].
第二轮后, 灯泡状态 [开启, 关闭, 开启].
第三轮后, 灯泡状态 [开启, 关闭, 关闭].
你应该返回 1,因为只有一个灯泡还亮着。
示例 2:
输入:n = 0
输出:0
示例 3:
输入:n = 1
输出:1
提示:
0 <= n <= 109题解
首先自己运行这面这段代码查看规律。
#includeusing namespace std; int main() { int sum=0; for(int i=1;i<=100;i++) { int ans=0; for(int j=1;j<=i;j++) { if(i%j==0)ans++; } sum+=(ans%2); cout< 发现规律,就可以写代码了。
class Solution { public: typedef long long ll; ll sum[100000],a[100000]; int bulbSwitch(int n) { if(n==0)return 0; sum[1]=3; a[1]=3; for(int i=2;i<100000;i++) { a[i]=a[i-1]+2; sum[i]=sum[i-1]+a[i]; } int l=1,r=100000,fin=0; while(l<=r) { int mid=(l+r)/2; if(sum[mid]



