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相关推荐
- Topcoder 2016 TCO Algorithm Algo Semifinal 1 Hard
链接:https://community.topcoder.com/stat?c=problem_statement&pm=14447&rd=16839 题意:给一个DAG图,记边是从 ...
- Topcoder 2016 TCO Algorithm Algo Semifinal 1 Hard ColorfunPath [网络流]
Description: 给一个DAGDAGDAG图,记边是从aiaia_i到bibib_i,边权cicic_i,要从000走到n" role="presentation" ...
- 2016 TCO Algorithm 1B SettingShield
题目大意 有h个普通栅栏,一个特殊栅栏和n棵植物 第i棵植物位于第i个单位 对于第i个普通栅栏有其保护的区间l[i]到r[i],特殊栅栏的保护区间是1到n 每个栅栏有一个非负整数s[i],表示它的强度 ...
- algorithm java_Java KeyPairGenerator getAlgorithm()用法及代码示例
java.security.KeyPairGenerator类的getAlgorithm()方法用于返回此 key 对生成器的算法的标准名称.有关标准算法名称的信息,请参见Java密码体系结构标准算法 ...
- 韵乐x5最佳参数手动_4种超参数调整技术及其局限性
每个数据科学家都应该知道的主流的超参数调整技术 导读 ML工作流中最困难的部分之一是为模型找到最好的超参数.ML模型的性能与超参数直接相关.超参数调优的越好,得到的模型就越好.调优超参数可能是非常乏味 ...
- 【超全面】机器学习中的超参优化方法总结
目录 1. 什么是超参数 2. 超参数类型 3. 主流超参优化方法 (1)手动调参 缺点: python代码:(例子) 手动调参 参数的重要性顺序 超参具体如何影响模型性能 超参合适的范围 (2)网格 ...
- android 文件加密的密码在哪里,android手机密码password.key文件加密方式?
满意答案 Joywhenny 2016.04.17 采纳率:53% 等级:9 已帮助:5216人 参考 Android Forensics May 27 加密是类似下面的方法,盐值是在/data ...
- 机器学习训练营-基于XGBoost的分类预测学习笔记
文章目录 前言 一.学习知识点概要 二.学习内容 1 XGBoost的应用及优缺点 1.1 XGBoost的应用 1.2 XGBoost的优缺点 2 基于天气数据集的XGBoost分类实战 2.1 目 ...
- 机器学习4个常用超参数调试方法!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:Sivasai,来源:AI公园 导读 ML工作流中最困难的部分之一 ...
最新文章
- 使用WinCrypt进行简单的对称加密实例
- UVA10881蚂蚁
- 站长必看系列:完全揭密百度和谷歌收录规律
- IOS 程序插件及功能动态更新思路┊
- 从直播答题看背后的移动音视频开发
- Leet Code OJ 58. Length of Last Word [Difficulty: Easy]
- Centos7安装部署Zabbix3.4
- vonic 环境配置_vonic单页面应用
- Numpy ndarry按行、列求和
- seam中格式化文本的处理
- java加载jdbc驱动,加载JDBC驱动
- DelayQueue实现原理及应用场景分析
- java.lang.UnsupportedOperationException与CleanMyMac X
- 智遥工作流——会签与多人审批区别
- vim 配置文件 ,高亮+自动缩进+行号+折叠+优化
- STM32G473CBT6关于ADC采集的总结
- 春风得意的 jQuery
- 计算机打印状态错误,打印机开始打印就显示错误怎么办?
- 自动化测试学习步骤及路线(超详细)
- mysql自学笔记九(Navicat Premium 15)
热门文章
- 百度TV运营商随视传媒发布新广告平台AdMan
- Frida出现process with pid XXXX either refused to load frida-agent, or terminated during injection错误的原因
- 虚拟机VMware 安装centos、常规配置、共享文件等
- XSS挑战之旅(1-9)
- BERT: 理解上下文的语言模型
- win10:如何查看可用内存插槽
- 「衡水中学语录分享」喜欢点波关注呗
- 91461452469259f108dee0593bece4cb
- android xml alpha,xml - Android和设置alpha(imageview alpha
- 机器学习中的敏感性和特异性的概念