问题 1818: [蓝桥杯][2014年第五届真题]生物芯片

问题 1818: [蓝桥杯][2014年第五届真题]生物芯片

时间限制: 1Sec 内存限制: 128MB 提交: 374 解决: 86

题目描述

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

思路:

 当某数为完全平方数时它一定不亮(1除外)因为完全平方数的约数数量为奇数但是1又不能改变开关 所以因数数量恒为偶数,所以问题就转换为在区间内有多少个非完全平方数,对于一个数,从1到n有的完全平方数有sqrt(n)个,则在区间L-R中共有sqrt(R)-sqrt(L)个完全平方数,非完全平方数:R-L+1-(sqrt(R)-sqrt(L))

#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
int main(){
    ll N,L,R;
    cin >> N >> L >> R;
    ll a = (ll)( sqrt(L) );
    ll b = (ll)( sqrt(R) );
    cout <<( R-L+1-b+a  ) << endl;
    return 0;
}
发布了761 篇原创文章 · 获赞 134 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/S_999999/article/details/104099883
今日推荐