日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF914G Sum the Fibonacci(FWT模板+子集卷积)

發(fā)布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF914G Sum the Fibonacci(FWT模板+子集卷积) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

title

題目

solution

(sa∣sb)&sc&(sd⊕se)=2i,i∈Z;sa&sb=0(s_a|s_b)\&s_c\&(s_d⊕s_e)=2^i,i∈Z;s_a\&s_b=0(sa?sb?)&sc?&(sd?se?)=2i,iZ;sa?&sb?=0
i=sa∣sb,j=sc,d=sd⊕sei=s_a|s_b,j=s_c,d=s_d⊕s_ei=sa?sb?,j=sc?,d=sd?se?

∑x∑i&j&k=xfibi?fibj?fibk?(∑sa∣sb=i,sa&sb=01)?(∑sc=j1)?(∑sd⊕se=k1)\sum_{x}\sum_{i\&j\&k=x}fib_i*fib_j*fib_k*(\sum_{s_a|s_b=i,s_a\&s_b=0}1)*(\sum_{s_c=j}1)*(\sum_{s_d⊕s_e=k}1)x?i&j&k=x?fibi??fibj??fibk??(sa?sb?=i,sa?&sb?=0?1)?(sc?=j?1)?(sd?se?=k?1)

fi=(∑sa∣sb=i,sa&sb=01),gj=(∑sc=j1),hk=(∑sd⊕se=k1)f_i=(\sum_{s_a|s_b=i,s_a\&s_b=0}1),g_j=(\sum_{s_c=j}1),h_k=(\sum_{s_d⊕s_e=k}1)fi?=(sa?sb?=i,sa?&sb?=0?1),gj?=(sc?=j?1),hk?=(sd?se?=k?1)
fff就是子集卷積直接做;ggg不做操作;hhh就是常規(guī)的FWT_xorFWT\_xorFWT_xor卷積
最后三個一起帶著各自的斐波拉契權(quán)值,做個FWT_andFWT\_andFWT_and卷積即可

code

#include <cstdio> #include <cstring> #define mod 1000000007 #define int long long #define maxn 1 << 18 int n, ret, inv = ( mod + 1 ) >> 1; int f[maxn], g[maxn], h[maxn], tmp[maxn], ans[maxn], fib[maxn]; int dp[20][maxn];void FWT_or( int *v, int opt ) {for( int i = 1;i < maxn;i <<= 1 )for( int j = 0;j < maxn;j += ( i << 1 ) )for( int k = 0;k < i;k ++ )v[j + k + i] = ( v[j + k + i] + v[j + k] * opt + mod ) % mod; }void FWT_and( int *v, int opt ) {for( int i = 1;i < maxn;i <<= 1 ) for( int j = 0;j < maxn;j += ( i << 1 ) )for( int k = 0;k < i;k ++ )v[j + k] = ( v[j + k] + v[j + k + i] * opt + mod ) % mod;; }void FWT_xor( int *v, int opt ) {for( int i = 1;i < maxn;i <<= 1 )for( int j = 0;j < maxn;j += ( i << 1 ) )for( int k = 0;k < i;k ++ ) {int x = v[j + k], y = v[j + k + i];v[j + k] = ( x + y ) % mod;v[j + k + i] = ( x - y + mod ) % mod;if( opt == -1 ) {v[j + k] = v[j + k] * inv % mod;v[j + k + i] = v[j + k + i] * inv % mod;}} }signed main() {scanf( "%lld", &n );for( int i = 1, x;i <= n;i ++ ) {scanf( "%lld", &x );f[x] ++, g[x] ++, h[x] ++;}fib[1] = 1;for( int i = 2;i < maxn;i ++ )fib[i] = ( fib[i - 1] + fib[i - 2] ) % mod;for( int i = 0;i < maxn;i ++ )dp[__builtin_popcount( i )][i] = f[i], f[i] = 0;n = 18;for( int i = 0;i < n;i ++ )FWT_or( dp[i], 1 );for( int i = 0;i < n;i ++ ) {memset( tmp, 0, sizeof( tmp ) );for( int j = 0;j <= i;j ++ )for( int k = 0;k < maxn;k ++ )tmp[k] = ( tmp[k] + dp[j][k] * dp[i - j][k] % mod ) % mod;FWT_or( tmp, -1 );for( int j = 0;j < maxn;j ++ )if( __builtin_popcount( j ) == i )f[j] = ( f[j] + tmp[j] ) % mod;}FWT_xor( h, 1 );for( int i = 0;i < maxn;i ++ )h[i] = h[i] * h[i] % mod;FWT_xor( h, -1 ); for( int i = 0;i < maxn;i ++ )f[i] = f[i] * fib[i] % mod, g[i] = g[i] * fib[i] % mod, h[i] = h[i] * fib[i] % mod;FWT_and( f, 1 ), FWT_and( g, 1 ), FWT_and( h, 1 );for( int i = 0;i < maxn;i ++ )ans[i] = f[i] * g[i] % mod * h[i] % mod;FWT_and( ans, -1 );for( int i = 1;i < maxn;i <<= 1 )ret = ( ret + ans[i] ) % mod;printf( "%lld\n", ret );return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的CF914G Sum the Fibonacci(FWT模板+子集卷积)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。