T216909 小卡与质数2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 1e3 + 10;
const int mod = 998244353;
typedef long long ll;
int a[] = {0, 0, 2, 2, 2, 5, 7, 13, 23, 43, 75, 137, 255, 464, 872, 1612, 3030, 5709, 10749, 20390, 38635};
int main(){
int t;
cin >> t;
while (t --) {
int x;
cin >> x;
int bx = x;
string s = "";
while(bx) {
s += (bx & 1) + '0';
bx >>= 1;
}
reverse(s.begin(), s.end());
int n = s.size();
int ans = 0;
for (int i = 0; i < n; i ++)
{
if (s[i] == '1') {
ans += a[i + 1];
}
}
cout << ans << endl;
}
return 0;
}
由于是和二进制有关,所以考虑二进制表示的情况下的规律。每次是选择比x小的所以,如果当前为1则选择变成0,异或之后高位全部变成0,低位有多种情况10000-11111,考虑这其中的质数个数就行了。我们可以预处理出来这样的数组优化算法。 当遇到困境要考虑换思路