在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
第一部分:题目 生物芯片 X博士正在研究一种生物芯片,其逻辑密集度、容量都远远高于普通的半导体芯片。 博士在芯片中设计了 n 个微型光源,每个光源操作一次就会改变其状态,即:点亮转为关闭,或关闭转为点亮。 这些光源的编号从 1 到 n,开始的时候所有光源都是关闭的。 博士计划在芯片上执行如下动作: 所有编号为2的倍数的光源操作一次,也就是把 2 4 6 8 ... 等序号光源打开 所有编号为3的倍数的光源操作一次, 也就是对 3 6 9 ... 等序号光源操作,注意此时6号光源又关闭了。 所有编号为4的倍数的光源操作一次。 ..... 直到编号为 n 的倍数的光源操作一次。
【输出格式】 例如: 再例如:
资源约定:
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意: main函数需要返回0 提交时,注意选择所期望的编译器类型。 第二部分:思路 本来我是按照原始方法写的。从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; }
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论