【发布时间】:2021-04-03 13:59:08
【问题描述】:
我想找到两个整数之间的偶校验数。以下是我目前所写的内容:
#include <bits/stdc++.h>
using namespace std;
#define fastio \
ios_base::sync_with_stdio(false); \
cin.tie(NULL)
#define ll long long int
bool findParity(ll x)
{
ll y = x ^ (x >> 1);
y = y ^ (y >> 2);
y = y ^ (y >> 4);
y = y ^ (y >> 8);
y = y ^ (y >> 16);
if (y & 1)
return 1;
return 0;
}
void solve()
{
ll a,b; cin >> a >> b;
ll evenparity = 0;
for(ll i = a; i <= b; ++i){
if(findParity(i)==0) evenparity++;
}
cout << evenparity;
}
signed main()
{
fastio;
solve();
return 0;
}
这很好用。但是,a 和b 两个整数之间的差异可以高达10^11,这意味着像这样的O(n) 解决方案将不起作用。有没有更有效的方法,即O(1) 解决这个问题?
【问题讨论】:
-
只是一个想法-感觉应该可以计算,因为位模式是可预测的。可能需要列举一些开始和结束的案例。
-
是的,如果不可能使用
O(1)方法,那么约束就不会那么高 -
如果 a 和 b 是偶数,是否也要计算?
-
Yeah, and the constraints wouldn't be so high if an O(1) approach isn't possible- 错误。O(log(n))可以很好地满足约束条件。