暴力计算矩阵
然后暴力状压
暴力统计
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<ctime>
using namespace std;
const long long mod = 1000000001;
int n;
bool vis[100005];
long long f[40][8000];
int rec[13][8000];
long long ans = 1;
int len[40];
long long calc(int x) {
int tot = 0;
long long ans = 0;
for (int i = x; i <= n; i <<= 1) {
len[++tot] = 0;
for (int j = i; j <= n; j *= 3) {
vis[j] = 1;
++len[tot];
}
}
f[0][1] = 1;
for (int i = 1; i <= tot; ++i) {
for (int j = 1; j <= rec[len[i]][0]; ++j) {
f[i][j] = 0;
for (int k = 1; k <= rec[len[i-1]][0]; ++k) {
if (rec[len[i]][j] & rec[len[i-1]][k]) continue;
f[i][j] += f[i-1][k];
f[i][j] %= mod;
}
}
}
for (int i = 1; i <= rec[len[tot]][0]; ++i) {
ans += f[tot][i];
ans %= mod;
}
return ans;
}
int main() {
for (int i = 1; i <= 12; ++i) {
int up = 1 << i;
for (int j = 0; j < up; ++j) {
if (j & (j >> 1)) continue;
rec[i][++rec[i][0]] = j;
}
}
rec[0][0] = 1;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
if (!vis[i]) {
ans *= calc(i);
ans %= mod;
}
}
printf("%lld", ans);
return 0;
}