1. 程式人生 > >CodeChef - MRO Method Resolution Order(打表)

CodeChef - MRO Method Resolution Order(打表)

題意:有一種關係叫繼承,那麼繼承父類的同時也會繼承他的一個函式f,能繼承任意多個父類或不繼承,但不能繼承自己的子類。現在規定一個列表,這個列表必須以1~N的順序排列,並且父類不會排在子類後面,1含有一個函式f,有多少種可能使得這樣一個列表每個數都繼承f,取模1e9+7

思路:終於做出了一道DP(?)題。題目的意思其實就是有幾種連法讓每個數直接或者間接和1相連。那麼我們假設dp[i]表示連到位置i時一共有多少種連法,那麼dp[i] = dp[i - 1] * (2i - 1 - 1),因為i前面已經連好了,我只要管i怎麼連,那麼i - 1條線至少取1條。

程式碼:

#include<set
> #include<map> #include<stack> #include<cmath> #include<queue> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> typedef long long ll; using namespace std; const int maxn = 1e5 + 10; const int
seed = 131; const ll MOD = 1e9 + 7; const int INF = 0x3f3f3f3f; ll dp[maxn]; int main(){ int t, n; dp[1] = 1; ll bit = 2; for(int i = 2; i <= 100005; i++){ dp[i] = dp[i - 1] * (bit - 1LL) % MOD; bit = bit * 2 % MOD; } scanf("%d", &t); while
(t--){ scanf("%d", &n); printf("%lld\n", dp[n]); } return 0; }