這個題就用到了上篇部落格遍歷子集的小技巧,
題意是找有多少個長度》=2的下降子串行,滿足mod2的lucas,並且值大於0
由lucas可以知道c(x,y)=c(a1,b1)*c(a2,b2)……由於ai,bi非零即1,所以 只要出現c(0,1)結果就會是0,
所以在轉移的時候,只要找到這個數二進位制中一的子集代表的數,轉移就好。
#includeusing namespace std;
const int n=3e5+10;
int n, a[n];
int dp[n];
bool vis[n];
int p=1e9+7;
int main()
vis[t]=true;
}int ans=0;
for(int i=1; i<=n; i++)
ans=(ans+dp[a[i]])%p;
printf("%d\n", ans);
return 0;
}
第二種方法是看那個數的子集包含自己,正著推
#include#define ll long long
using namespace std;
const int mod = 1000000007;
ll f[233334], n, ans = 0;
int main()
printf("%lld\n", ans);
return 0;
}
遞推DP 加深
zoj 3747 題意 給n個士兵排隊,每個士兵三種g r p可選,求至少有m個連續g士兵,最多有k個連續r士兵的排列的種數。都轉化為至多的士兵連續的個數。令集合a 集合b c a b 在轉化要如何求 至多x個g士兵連續,至多y個士兵連續 dp i 0 至多i個g 的方案數 dp i 1 至多i個r...
數字轉換(dp 數論)
題意 如果乙個數 x 的約數之和 y 不包括他本身 比他本身小,那麼 x 可以變成 y,y 也可以變成 x。例如,4 可以變為 3,1 可以變為 7。限定所有數字變換在不超過 n 的正整數範圍內進行,求不斷進行數字變換且不出現重複數字的最多變換步數。思路 可以將每個數與能到達的數之間連一條邊,這樣就...
每日演算法 計數DP和遞推DP
計數pd就是emm感覺求那種什麼路徑和的就是計數那一類的,再概括一下就是可以不用其他操作直接將它相鄰或者說符合要求的 求和,就是下乙個位置的值。回到這題 用動規很好做。我們想要知道 0,0 到終點的位置的路徑,只需要知道終點已左終點已下的路徑為多少就行了。dp i j 0,0 到 i,j 位置的路徑...