简要题意
有 \(N\) 个二进制数,编号为 \(1\sim N\),初始时都是 \(0\)。博士进行了 \(N-1\) 次操作,在第 \(i\) 次操作时,会将 \(1\sim N\) 中所有编号为 \(i+1\) 的倍数的二进制数取反。最后给定一个区间 \([L,R]\),你需要求出 \([L,R]\) 中的所有二进制数中为 \(1\) 的个数。
示例:\(N=10,L=3,R=6\) 时,答案是 \(3\)(\(3,5,6\) 被计算)。
思路
首先,我们可以发现,这道题求的就是 \([L,R]\) 中有奇数个因子的数。奇数个因子的数不太好算,我们可以改算偶数因子的数。又因为偶数因子的数一定时完全平方数。我们可以枚举 \(i\),如果 \(L\leq i^2\leq R\),就计算一个完全平方数 \(i^2\)。最后用 \(r-l+1\) 减去完全平方数的个数即可。
时间复杂度 \(O(\sqrt{R})\)。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,l,r,rt;
signed main(){
cin>>n>>l>>r;
rt = (r-l+1);
for(int i=1;i<=ceil(sqrt(r));i++){
int sq=i*i;
if(l<=sq&&sq<=r){
rt--;
}
}
cout<<rt;
return 0;
}
标签:平方,二进制,蓝桥,int,因子,2014,生物芯片
From: https://www.cnblogs.com/zheyuanxie/p/p8622.html