題目要求若出現x,則不能出現2x,3x
所以我們考慮構造乙個矩陣
\(1\ 2\ 4 \ 8……\)
\(3\ 6\ 12\ 24……\)
\(9\ 18\ 36……\)
\(……\)
不難發現,對於乙個矩陣,若我選擇了乙個數x,則在矩陣內該數的相鄰格仔都不能選,題目就被轉化成了玉公尺田了,可以用狀壓dp解決
但是直接做是不對的,比如5就沒有出現在這個序列中
所以我們可以構造多個矩陣,用乘法原理統計答案即可
#includeusing namespace std;
#define il inline
#define re register
#define debug printf("now is line : %d\n",__line__)
#define file(a) freopen(#a".in","r",stdin);//freopen(#a".out","w",stdout)
#define int long long
#define inf 123456789
#define mod 1000000001
il int read()
while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x * f;
}#define rep(i, s, t) for(re int i = s; i <= t; ++ i)
#define drep(i, s, t) for(re int i = t; i >= s; -- i)
#define mem(k, p) memset(k, p, sizeof(k))
#define maxn 100005
int n, m, a[20][20], g[1 << 15], vis[maxn], h, l[20], dp[20][1 << 15], ans = 1;
il void martix(int x)
}}il int solve() }}
int t = 0;
rep(i, 0, (1 << l[h]) - 1) t = (t + dp[h][i]) % mod;
return t;
}signed main()
HNOI2012 集合選數 狀壓 dp
求對於正整數 n leq 1e5 的滿足約束條件 若 x 在該子集中,則 2x 和 3x 不在該子集中.的子集個數.是一道很妙的構造 狀壓 dp 題吖.我最開始想這題的時候畫了乙個如下的圖.對於每乙個點,左兒子是它的兩倍,右兒子是它的三倍.約束條件是 連了邊的兩個點是不可以同時選的,也就是只能隔乙個...
HNOI2012 集合選數
這是題目 大概就是讓你找方案數嘛。開始我還以為是一道規律題,然後有愉快地打了乙個暴搜打表。找了十分鐘沒找出來。www.oeis.org。結果.這是表 半點規律沒有。然後想了想dp,想不出線性或帶log的。最後實在做不出來了,於是問了個大犇。大犇說這道題要用矩形。尼瑪沒在逗我。把題目意思轉換一下嘛。就...
題解 HNOI2012 集合選數
題目傳送門 直接看題面吧。感覺挺水的一道題啊?怎麼評到紫色的啊?考試的時候ljs出了這個題的加強版我就只想出這個思路,然後就爆了。不難發現,我們可以構造矩陣 x 2x 4x 6x 3x 6x 12x 24x 48x 9x 18x 36x 然後實際上就相當於在這個矩陣中選出一些數使得兩兩不相鄰。因為行...