首页 > 其他分享 >OJ刷题之旅

OJ刷题之旅

时间:2023-05-14 13:33:11浏览次数:39  
标签:星星 正整数 挥动 奇数 魔法 个数 刷题 OJ

题目描述

wzazzy先将天上n个星星排成一排,起初它们都是暗的。

他将挥动n次魔法棒,第i次挥动会将编号为i的正整数倍的星星的亮暗反转,即亮的星星转暗,暗的星星转亮。

wzazzy想问,最终会有多少个星星依旧闪亮在天空。

输入

一个整数n,含义请见题目描述。1<=n<=1e18

输出

一个整数ans,即n次操作后会有多少个星星依旧闪亮。

样例

输入 Copy 3 输出 Copy 1

题解

首先,我们来观察一下挥动魔法棒的过程,将其抽象为对一个长度为 $n$ 的二进制串的操作。比如当 $n=6$ 时,第一次挥动魔法棒相当于将二进制串中所有以 $1$ 结尾的位置取反,即 $110 \Rightarrow 100$;第二次挥动魔法棒相当于将所有以 $10$ 结尾的位置取反,即 $100 \Rightarrow 101$;第三次挥动魔法棒相当于将所有以 $11$ 结尾的位置取反,即 $101 \Rightarrow 001$。

那么,对于一个二进制位 $i$,如果它被挥动了奇数次魔法棒,那么最终它就会变成和 $1$ 不同的数,也就是说它最终的亮暗状态会发生改变;反之,如果它被挥动了偶数次魔法棒,那么最终它的亮暗状态不会改变。

考虑对于某个正整数 $d$,它会被哪些数挥动魔法棒。因为 $d$ 的倍数就是以 $d$ 结尾的数,所以一个以 $d$ 结尾的数会在第 $d$ 次、第 $2d$ 次、第 $3d$ 次……挥动魔法棒。也就是说,如果 $d$ 的因子个数为奇数,那么 $d$ 最终的亮暗状态会发生改变;否则,$d$ 最终的亮暗状态不会改变。

因此,我们只需要求出 $1$ 到 $n$ 中因子个数为奇数的正整数个数即可。对于一个正整数 $d$,它的因子个数为奇数当且仅当它是一个完全平方数,因为对于任意正整数 $n$,如果 $n$ 可以分解成质因数的幂的乘积 $n=p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}$,那么它的因子个数就是 $(a_1+1)(a_2+1)\cdots(a_k+1)$,因此只有当所有指数都为偶数时这个值才为奇数。

因此,我们可以通过求 $1$ 到 $n$ 中完全平方数的个数来得到因子个数为奇数的正整数个数。完全平方数的个数平均每 $2\sqrt{n}$ 个数中才会有一个,所以 $1$ 到 $n$ 中完全平方数的个数大概就是 $\sqrt{n}/2$,因此最终的答案就是 $\lfloor \sqrt{n} \rfloor$。注意在 C 语言中需要使用 long long 类型来存储较大的整数。

代码

完整的 C 语言程序如下:

#include <stdio.h>
typedef long long ll;
int main() {
    ll n;
    scanf("%lld", &n);
    printf("%lld\n", (ll) (sqrt(n)));
    return 0;
}

标签:星星,正整数,挥动,奇数,魔法,个数,刷题,OJ
From: https://blog.51cto.com/u_16060410/6274856

相关文章

  • ERROR:Could not build wheels for pycocotools, which is required to install pypro
    在创建了conda虚拟环境后,下载pycocotools包,出现这个错误,终端下载包失败,从网上直接将下载好的pycocotools包导入到,所需要环境(conda环境,本机环境)比如:anaconda\envs\py38\Lib\site-packages下面pycocotools包下载:链接:https://pan.baidu.com/s/1RsV1w0GRXJZ1rR3yPBg5FA提取码:88......
  • LeetCode 刷题 —— 辅助栈
     42. 接雨水classSolution{publicinttrap(int[]height){intres=0;Stack<Integer>leftWallStack=newStack();intlen=height.length;leftWallStack.push(0);for(inti=1;i<len;i++){......
  • CS61B_project_gold
    题目描述 1importstaticorg.junit.Assert.*;2importorg.junit.Test;34publicclassTestArrayDequeGold{5@Test6publicvoidtestStudentArrayDeque(){7StudentArrayDeque<Integer>testArray=newStudentArrayDeque<>......
  • 【华为HCIP | 高级网络工程师】刷题日记(5)
    文章目录每日刷题30道1、已知路由器R1存在Loopback0且地址为1.1.1.1/32,在使能OSPF并引入直连路由时会把该环回口引入。那么以下哪一项的配置能够实现在引入直连路由时,Loopback0不会被引入,并能够保证其他直连路由引入到OSPF内?2、在MA网络中的两台DRother路由器R1和R2建立邻居关系,那......
  • 【华为HCIP | 高级网络工程师】刷题日记(4)
    文章目录每日刷题30道1、在OSPF中部署Filter-Policy时,Filter-Policy会修改该OSPF的LSDB。2、如图所示,R1和R2已在BFD中配置了本端发送时间间隔和本端接收时间间隔及本端的BFD检测倍数。现R1和R2采用异步模式检测,那么R1实际检测时间是多少?3、USG防火墙上存在多个默认安全区域,其中Unt......
  • 文件包含刷题
    web81if(isset($_GET['file'])){$file=$_GET['file'];$file=str_replace("php","???",$file);$file=str_replace("data","???",$file);$file=str_replace(":",&q......
  • 实验六-Salt本地pojie实验
    【实验目的】了解Salt型密码的加密机制,学会使用本地密码pojie工具来pojieSalt型密码,了解pojie密码原理。【知识点】Salt,密码pojie【实验原理】1.Salt概念在密码保护技术中,salt是用来修改口令散列的随机数据串。可将salt加入散列,即使系统的另一用户也选用了同一口令,也可通过唯......
  • 最近VJ刷题整理
    BitsReverse题意:给出两个数,每次操作其中一个数,将其二进制位上连续的三个数翻转,求最小的操作次数Solution每次操作相当于交换了左右两个二进制位的数,所以一次操作只会改变奇数位/偶数位上的数,考虑到只用求最小的操作次数,我们可以将每个数的二进制位上的1所在的位置分奇偶存一下......
  • AtCoder DP系列刷题记录
    直面自己的弱点。AFrog1简单线性\(\text{dp}\),令\(dp_i\)为跳到第\(i\)块石头的最小花费,易得:\[dp_i+=\min(|a_i-a_{i-1}|,|a_i-a_{i-2}|)\]BFrog2很快就写完了,但是一直调了十分钟,耻辱啊。如果反着跳,第\(i\)根木桩只能从第\(i+1\)或\(i+2\)木桩上跳到,则有:\[d......
  • Golang刷题日志--岛屿问题
    1.给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例代码:import"fmt"funcnumIsIands(grid[][]byte)int{ //记录岛......