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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Topcoder 2016 TCO Algorithm Algo Semifinal 2 Hard

發布時間:2023/12/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Topcoder 2016 TCO Algorithm Algo Semifinal 2 Hard 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:https://community.topcoder.com/stat?c=problem_statement&pm=14436&rd=16841

題意:對于一個大小為k的線性基,可以構造出2 ^ k種不同的異或,其中第rank[i]小的為value[i],求有多少個線性基滿足要求。

題解:

注意分析線性基的性質

1、顯然rank和value是可以直接消的,先把rank消成主對角線和一些自由元;

2、rank[i]的最高位對應的基(的位置)一定是value[i]的最高位,記為must

3、f(i, j)表示當前考慮第i位(前i - 1位已經考慮完了),考慮第j個基(前j - 1個基已經考慮完了)的方案數

4、考慮從f(i, j)轉移到f(i + 1, j / j + 1)

顯然是f(i + 1, j) += f(i + 1, j + 1),我們只考慮f(i, j)到f(i + 1, j + 1)

先判是否i作為第j + 1個基是合法的,如果合法如果must[j] == i,直接轉移

如果must[j]沒有限制,那么這個基里有2 ^ (i - j)種放法(共有2 ^ i種,j個基必須按照要求放)

最好記一個g(i, j)表示f(i, j)是否合法,這樣不會出現f(i, j) % mod = 0而f(i, j) != 0的情況,否則判inf可能會掛

#include <bits/stdc++.h> #define xx first #define yy second #define mp make_pair #define pb push_back #define fill( x, y ) memset( x, y, sizeof x ) #define copy( x, y ) memcpy( x, y, sizeof x ) using namespace std;typedef long long LL; typedef pair < int, int > pa;const int mod = 1e9 + 7;int f[35][35], must[35]; bool g[35][35], lb[35];inline void inc(int &x, int y) { x += y; if( x >= mod ) x -= mod; }class XorRank {public:int count(int m, vector < int > rk, vector < int > val){for( int i = 0 ; i < m ; i++ ) must[ i ] = -1;int n = rk.size(), rk_max = 0, inf = 0;for( int i = 0 ; i < n ; i++ ) rk_max = max( rk_max, rk[ i ] );inf = rk_max < ( 1 << m - 1 );for( int i = m - 1 ; ~i ; i-- )for( int j = 0 ; j < n ; j++ ) if( !lb[ j ] && rk[ j ] >> i & 1 ){lb[ j ] = 1;for( int k = 0 ; k < n ; k++ ) if( j ^ k ) if( rk[ k ] >> i & 1 ) rk[ k ] ^= rk[ j ], val[ k ] ^= val[ j ]; break;}for( int i = 0 ; i < n ; i++ ) if( ( !rk[ i ] && val[ i ] ) || ( rk[ i ] && !val[ i ] ) ) return 0;for( int i = 0 ; i < n ; i++ ) if( rk[ i ] ){int high_bit = -1, high_val = -1;for( int j = m - 1 ; ~j ; j-- ) if( rk[ i ] >> j & 1 ) { high_bit = j; break; }for( int j = 29 ; ~j ; j-- ) if( val[ i ] >> j & 1 ) { high_val = j; break; }must[ high_bit ] = high_val;}f[ 0 ][ 0 ] = g[ 0 ][ 0 ] = 1;for( int i = 0 ; i < 30 ; i++ )for( int j = 0 ; j <= m ; j++ ) if( g[ i ][ j ] ){g[ i + 1 ][ j ] = 1;inc( f[ i + 1 ][ j ], f[ i ][ j ] );bool flag = true;for( int k = 0 ; k < n ; k++ )if( ( rk[ k ] >> j & 1 ) ^ ( val[ k ] >> i & 1 ) ) { flag = false; break; }if( flag ){if( must[ j ] == i ) inc( f[ i + 1 ][ j + 1 ], f[ i ][ j ] ), g[ i + 1 ][ j + 1 ] = 1;if( !~must[ j ] ) inc( f[ i + 1 ][ j + 1 ], ( 1LL << i - j ) * f[ i ][ j ] % mod ), g[ i + 1 ][ j + 1 ] = 1;}}if( !g[ 30 ][ m ] ) return 0;if( inf ) return -1;return f[ 30 ][ m ];} };

總結

以上是生活随笔為你收集整理的Topcoder 2016 TCO Algorithm Algo Semifinal 2 Hard的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。