Middle-题目5:319. Bulb Switcher

本文解析了一道关于灯泡开关的问题,通过数学方法证明了只有完全平方数编号的灯泡在经过n轮开关操作后会保持开启状态,并提供了一个简单的C语言实现。

题目原文:
There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it’s off or turning off if it’s on). For the ith round, you toggle every i bulb. For the nth round, you only toggle the last bulb. Find how many bulbs are on after n rounds.

Example:

Given n = 3.

At first, the three bulbs are [off, off, off].
After first round, the three bulbs are [on, on, on].
After second round, the three bulbs are [on, off, on].
After third round, the three bulbs are [on, off, off].

So you should return 1, because there is only one bulb is on.
题目大意:
起初有n个灯泡,都是关闭的,你进行n轮操作:
第1轮,你把每个灯泡的状态都改变(打开的关闭,关闭的打开);
第2轮,你把每个灯泡序号是2的倍数的灯泡都改变状态(灯泡序号从1开始);
……
第i轮,你把每个灯泡序号是i的倍数的灯泡都改变状态(灯泡序号从1开始);
……
第n轮,你把最后一个灯泡改变状态(因为1~n里面n的倍数只有n)
求n轮过后,还有几个灯泡亮着?
题目分析:
若一个灯泡在n轮过后还是亮的,说明这个灯泡被改变了奇数次,因为只有被轮数整除的时候才能变状态,所以[1,k]能整除这个灯泡序号k的正整数是奇数个。
以下证明k是个完全平方数。
首先,若灯泡的序号i是平方数,则i的因数一定是奇数个,证明:
因为i是平方数,所以i=k*k,其中k∈Z,而1能整除i,所以i的因数个数为k的非1因子个数*2+1,一定是一个奇数。
那么若i不是平方数,i的因数必然是偶数个,证明:
设所有<i的因子构成的集合为A,>i的因子构成的集合为B,显然A∪B即为i的所有因子构成的集合,而对任意a∈A,必存在唯一的i/a∈B,反之亦然,所以A和B两个集合的元素个数相等。
综上证明,只有≤n的完全平方数最后是亮的。那么求i的取整即可。一行代码解决。
源码:(language : c)

int bulbSwitch(int n) {
    return sqrt(n);
}

成绩:
0ms,beats 6.36%,众数0ms,93.14%
Cmershen的碎碎念:
这道题起初只想到进行模拟,但看到discuss中给出的答案是求sqrt(n),遂想到了上述证明过程。

运行后提示2025-06-09 09:42:30.247883572 [E:onnxruntime:Default, provider_bridge_ort.cc:2195 TryGetProviderInfo_CUDA] /onnxruntime_src/onnxruntime/core/session/provider_bridge_ort.cc:1778 onnxruntime::Provider& onnxruntime::ProviderLibrary::Get() [ONNXRuntimeError] : 1 : FAIL : Failed to load library libonnxruntime_providers_cuda.so with error: libcublasLt.so.12: cannot open shared object file: No such file or directory 2025-06-09 09:42:30.247901516 [W:onnxruntime:Default, onnxruntime_pybind_state.cc:1055 CreateExecutionProviderInstance] Failed to create CUDAExecutionProvider. Require cuDNN 9.* and CUDA 12.*. Please install all dependencies as mentioned in the GPU requirements page (https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements), make sure they're in the PATH, and that your GPU is supported. 2025-06-09 09:42:30,281 - OrtInferSession - WARNING: CUDAExecutionProvider is not avaiable for current env, the inference part is automatically shifted to be executed under CPUExecutionProvider. 2025-06-09 09:42:30.312673212 [E:onnxruntime:Default, provider_bridge_ort.cc:2195 TryGetProviderInfo_CUDA] /onnxruntime_src/onnxruntime/core/session/provider_bridge_ort.cc:1778 onnxruntime::Provider& onnxruntime::ProviderLibrary::Get() [ONNXRuntimeError] : 1 : FAIL : Failed to load library libonnxruntime_providers_cuda.so with error: libcublasLt.so.12: cannot open shared object file: No such file or directory 2025-06-09 09:42:30.312692328 [W:onnxruntime:Default, onnxruntime_pybind_state.cc:1055 CreateExecutionProviderInstance] Failed to create CUDAExecutionProvider. Require cuDNN 9.* and CUDA 12.*. Please install all dependencies as mentioned in the GPU requirements page (https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements), make sure they're in the PATH, and that your GPU is supported. 2025-06-09 09:42:30,357 - OrtInferSession - WARNING: CUDAExecutionProvider is not avaiable for current env, the inference part is automatically shifted to be executed under CPUExecutionProvider.
最新发布
06-10
<think>我们面对的是ONNXRuntime的CUDAExecutionProvider加载失败问题,具体是缺少`libcublaslt.so.12`,同时要求安装cuDNN9.*和CUDA12.*。根据引用[1],需要按照ONNXRuntime的GPU要求安装依赖。同时引用[2]提供了cuDNN的安装方法(虽然针对的是CUDA10.2,但方法类似)。我们将按步骤解决。###解决步骤####1.确认CUDA和cuDNN版本要求ONNXRuntime的CUDAExecutionProvider要求:-CUDA版本:12.1-cuDNN版本:8.5.0或更高(但根据错误提示,要求cuDNN9.*,实际上cuDNN9.x对应的是CUDA12.x?注意版本匹配)根据[ONNXRuntime官方文档](https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements)(引用[1]中的链接),当前(2024年)的依赖版本为:-CUDA11.8或12.x-cuDNN8.x或9.x(与CUDA版本匹配)而错误信息要求:`cuDNN9.*`和`CUDA12.*`。因此我们选择安装CUDA12.x和cuDNN9.x。####2.安装CUDA12.x访问[NVIDIACUDAToolkit下载页面](https://developer.nvidia.com/cuda-toolkit-archive),选择CUDA12.x版本(例如12.4)下载。根据操作系统选择安装方式。以Ubuntu22.04为例:```bashwgethttps://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda-repo-debian12-12-4-local_12.4.0-495.29.05-1_amd64.debsudodpkg-icuda-repo-debian12-12-4-local_12.4.0-495.29.05-1_amd64.debsudocp/var/cuda-repo-debian12-12-4-local/cuda-*-keyring.gpg/usr/share/keyrings/sudoapt-getupdatesudoapt-get-yinstallcuda-12-4```安装完成后,将CUDA添加到环境变量(在~/.bashrc或/etc/profile中):```bashexportPATH=/usr/local/cuda-12.4/bin${PATH:+:${PATH}}exportLD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}```运行`source~/.bashrc`使其生效。####3.安装cuDNN访问[NVIDIAcuDNN下载页面](https://developer.nvidia.com/rdp/cudnn-download),需要注册账号。下载与CUDA12.x匹配的cuDNN版本。根据错误提示,我们需要cuDNN9.x,但实际上cuDNN的版本号已经更新,例如cuDNN9.x对应的是cudnnv9.x.xforCUDA12.x。注意:cuDNN版本号与CUDA版本必须严格匹配。例如,如果我们安装了CUDA12.4,则选择cuDNNv9.x.xforCUDA12.x。下载后解压(以cuDNNv9.0.0forCUDA12.x为例):```bashtar-xzvfcudnn-linux-x86_64-9.0.0.xxx_cuda12-archive.tar.xz```然后将文件复制到CUDA安装目录(与引用[2]类似):```bashsudocpcudnn-*-archive/include/cudnn*.h/usr/local/cuda/includesudocp-Pcudnn-*-archive/lib/libcudnn*/usr/local/cuda/lib64sudochmoda+r/usr/local/cuda/include/cudnn*.h/usr/local/cuda/lib64/libcudnn*```####4.验证安装检查CUDA:```bashnvcc--version```应显示CUDA12.x检查cuDNN:```bashcat/usr/local/cuda/include/cudnn_version.h|grepCUDNN_MAJOR-A2```应显示cuDNN的版本信息,包括主版本9。####5.重新安装ONNXRuntime(可选)如果之前安装的onnxruntime-gpu版本不匹配,可能需要重新安装。注意选择支持CUDA12.x的版本。```bashpipuninstallonnxruntimeonnxruntime-gpupipinstallonnxruntime-gpu==1.17.0#确认该版本支持CUDA12.x```####6.设置运行时库路径确保动态链接库路径正确。如果运行时仍找不到库,可以尝试:```bashexportLD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH```####7.验证ONNXRuntime的CUDA支持在Python中运行:```pythonimportonnxruntimeasortprint(ort.get_available_providers())```如果输出中包含`'CUDAExecutionProvider'`,则表示成功。###可能的问题及解决方法-**库版本冲突**:如果系统中有多个CUDA版本,可以通过调整环境变量来指定版本。-**符号链接问题**:如果库文件有多个版本,可能需要创建符号链接,例如:```bashsudoln-s/usr/local/cuda/lib64/libcublaslt.so.12/usr/local/cuda/lib64/libcublaslt.so```-**权限问题**:确保用户对CUDA目录有读取权限。如果遇到其他问题,请参考ONNXRuntime官方文档或社区支持。[^1]:[ONNXRuntimeGPU要求](https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements)[^2]:安装cuDNN的方法§§相关问题§§1.如何在同一台机器上管理多个CUDA版本?2.如何在Docker容器中部署ONNXRuntimeGPU环境?3.如何验证ONNXRuntimeGPU加速是否生效?</think> ### 解决ONNXRuntime CUDAExecutionProvider加载失败问题 #### **问题分析** 错误`failed to load libcublaslt.so.12`和提示`install cudnn 9.* cuda 12.*`表明: - ONNXRuntime需要**CUDA 12.x**和**cuDNN 9.x**依赖库[^1] - 当前环境缺少`libcublaslt.so.12`(CUDA核心数学库) - 库文件路径可能未正确配置 #### **解决方案(分步操作)** --- ##### **1. 安装CUDA 12.x** 下载地址:[NVIDIA CUDA Toolkit Archive](https://developer.nvidia.com/cuda-toolkit-archive) ```bash # Ubuntu安装示例 wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda-repo-ubuntu2204-12-4-local_12.4.0-495.29.05-1_amd64.deb sudo dpkg -i cuda-repo-ubuntu2204-12-4-local_12.4.0-495.29.05-1_amd64.deb sudo cp /var/cuda-repo-ubuntu2204-12-4-local/cuda-*-keyring.gpg /usr/share/keyrings/ sudo apt update sudo apt -y install cuda-12-4 ``` ##### **2. 安装cuDNN 9.x** 下载地址:[NVIDIA cuDNN Archive](https://developer.nvidia.com/rdp/cudnn-archive) (需注册账户) ```bash # 解压并复制库文件到CUDA目录[^2] tar -xzvf cudnn-linux-x86_64-9.x.x.x_cuda12-archive.tar.xz sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64 sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn* ``` ##### **3. 配置环境变量** 编辑`~/.bashrc`文件: ```bash export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH ``` 应用配置: ```bash source ~/.bashrc ``` ##### **4. 验证依赖安装** ```bash # 检查CUDA版本 nvcc --version # 应输出 12.x # 检查cuDNN版本 cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2 ``` ##### **5. 重建OpenCV链接** 若使用OpenCV,需重新编译链接CUDA[^3]: ```bash cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_EXE_LINKER_FLAGS=-lcublas \ -D WITH_CUDA=ON \ -D CUDA_ARCH_BIN=.. # 添加本机GPU算力 ``` ##### **6. 更新ONNXRuntime环境** ```bash pip uninstall onnxruntime pip install onnxruntime-gpu ``` #### **常见问题排查** - **缺失libcublaslt.so.12**: ```bash sudo ln -s /usr/local/cuda/lib64/libcublas.so.12 /usr/lib/libcublaslt.so.12 ``` - **版本冲突**: - 确保cuDNN和CUDA版本严格匹配(CUDA 12.x + cuDNN 9.x) - 卸载其他版本的CUDA:`sudo apt purge cuda-*` #### **验证成功** 运行Python测试: ```python import onnxruntime as ort print(ort.get_available_providers()) # 应包含'CUDAExecutionProvider' ``` > :bulb: **提示**:通过`nvidia-smi`确认GPU状态,并通过`nvtop`实时监控GPU使用率
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值