[CTSC2017]吉夫特(思维+巧妙)
生活随笔
收集整理的這篇文章主要介紹了
[CTSC2017]吉夫特(思维+巧妙)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
description
戳我看題目
solution
顯然只要選出來的子序列有一個組合數為偶數,最后取模 222 的結果都會是零
有一個結論:當且僅當n&m=m時,CnmC_n^mCnm?為奇數
所以我們要選的子序列,任意相鄰兩位中后一位的下標和前一位的下標都要滿足上面這個結論,才會是奇數
由此就跟二進制扯上了關系
設f[i]f[i]f[i]表示強制以a[i]a[i]a[i]結尾的合法方案數
結合二進制進行很妙的優化,217<n<2182^{17}<n<2^{18}217<n<218
轉移和更新交替進行,從而達到最原始的思路實現,也降了時間復雜度
code
#include <cstdio> #define mod 1000000007 #define lim ( 1 << 9 ) - 1 int n; long long ans; long long f[1 << 18];int main() {scanf( "%d", &n );for( int i = 1, x;i <= n;i ++ ) {scanf( "%d", &x );int l = x & lim, r = x >> 9, t = 0;for( int j = r;j <= lim;j = ( j + 1 ) | r ) //轉移:枚舉前9位的超集t = ( t + f[( j << 9 ) | l] ) % mod;ans = ( ans + t ) % mod;t ++; //a[i]本身算一個r <<= 9; for( int j = l;j;j = ( j - 1 ) & l ) //更新:枚舉后9位的子集f[j | r] = ( f[j | r] + t ) % mod;f[r] = ( f[r] + t ) % mod; //0|r也算合法方案 特殊處理}printf( "%lld", ans );return 0; }總結
以上是生活随笔為你收集整理的[CTSC2017]吉夫特(思维+巧妙)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔法少女小圆op是什么 快快来看吧
- 下一篇: 杀阡陌是谁演的 扮演者是马可