• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

第五届蓝桥杯决赛C\C++B组——生物芯片

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

第一部分:题目

生物芯片

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

再例如:
输入:
10 3 6
程序应该输出:
3

 

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms


请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

第二部分:思路

本来我是按照原始方法写的。从L~R对2~ n进行计算,如果因子数为奇数那么该光源就是关闭的,因为是从2开始计算的,而1是所有数的一个因子,所以因子数为奇数的都关闭了。这种方法结果很明显,超时。然后看了网上的讨论。得知因子数为奇数的数叫做完全平方数,完全平方数就是能够写成m*m的形式的数,它其中一个特点就是因子数是奇数个。但是数据是10的15次方,如果一个个判断还是超时,怎么办呢?声明一个变量 i 从 L 的算术平方根开始枚举,直到 i*i 大于R。只要i*i在[L,R]范围内,那么说明编号为 i*i 的光源是关闭的。定义sum=R-L+1,表示区间内光源总数,每当光源是关闭的就减一。

第三部分:代码

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    int n;
    long long a,b,len=0;//因为数据比较大,定义为long long 型 
    scanf("%lld%lld%lld",&n,&a,&b);
    long long sum;
    sum=b-a+1;//区间中光源总数 
    for(long long i=sqrt(a);i*i<=b;i++)
    {
            if(i*i>=a&&i*i<=b)
            {
                sum--;//关闭的光源减去 
            }
    } 
    printf("%lld\n",sum); 
    return 0;
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C/C++C++(std::nothrow)发布时间:2022-07-14
下一篇:
C#Unicode编码与解码方法发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap