题目:
X博士正在研究一种生物芯片,其逻辑密集度、容量都远远高于普通的半导体芯片。
博士在芯片中设计了 n 个微型光源,每个光源操作一次就会改变其状态,即:点亮转为关闭,或关闭转为点亮。
这些光源的编号从 1 到 n,开始的时候所有光源都是关闭的。
博士计划在芯片上执行如下动作:
所有编号为2的倍数的光源操作一次,也就是把 2 4 6 8 … 等序号光源打开
所有编号为3的倍数的光源操作一次, 也就是对 3 6 9 … 等序号光源操作,注意此时6号光源又关闭了。
所有编号为4的倍数的光源操作一次。
…
直到编号为 n 的倍数的光源操作一次。
X博士想知道:经过这些操作后,某个区间中的哪些光源是点亮的。
输入
3个用空格分开的整数:N L R (L<R<N<10^15) N表示光源数,L表示区间的左边界,R表示区间的右边界。
输出
输出1个整数,表示经过所有操作后,[L,R] 区间中有多少个光源是点亮的。
样例输入
5 2 3
样例输出
2
最开始自己在vscode中写的代码,但是在网站上提交 超出了限制。。但是示例是能通过的。
n,l,r=100,50,84
light=[-1]*(r-l+1)#-1代表灯泡熄灭,+1代表灯泡被点亮
for a in ran+ge(2,n1):
for b in range(l,r+1):
c=b
if c%a==0:
light[b-l]*=(-1)
print(light.count(1))
然后看了题解,但是没想明白为什么出现当前灯泡编号的开平方根再平方不同时当前的灯泡最后就处于点亮的状态。
math模块中的sqrt(x)**2,有的数字是会不等于自己的。比如当x==7的时候。↓↓↓
import math
print(math.sqrt(7)**2)
运行结果:
然后就手动弄了一下示例实验了一下,确实有这么一个规律
分别是5个灯泡和7个灯泡的。
0代表熄灭,1代表点亮
00000
01010
01110
01100
01101
最后别点亮的灯泡的编号是2,3,5
0000000
0101010
0111000
0110000
0110100
0110110
0110111
最后别点亮的灯泡的编号是2,3,5,6,7
import math
N,L,R = map(int,input().split())
count = 0
for i in range(L,R+1):
if int(math.sqrt(i))**2 != i:
count += 1
print(count)