[BZOJ4851][JSOI2016]位运算[矩阵快速幂]
题意
给定长度为 \(\rm |S|\) 的 \(\rm 01\) 串并将其倍长 \(k\) 次得到一个 \(\rm|S|\times k\) 位的二进制数 \(R\) ,求有多少种在 \([0,R-1]\) 中选择
\(m\) 个互不相同的数字使得其异或和为 \(0\) 的方案。
\(\rm |S|\leq 50\ ,k \leq 10^5\ ,m\leq 7\) .
分析
假设选定的 \(m\) 个数字满足 \(A_0 < A_1 < \cdots < A_{m-1}\).
定义状态 \(f_S\) ,每一个二进制位表示 \(A_i\) 是否大于 \(A_{i+1}\) ,最后一位表示 \(A_{m-1}\) 是否小于上界(类似数位dp)。
对于原串每一位构造矩阵,对于循环转移相同,快速幂即可。
总时间复杂度为 \(O(2^{3n}*(log\ k+|S|))\).
代码
#include<bits/stdc++.h>
using namespace std;
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
typedef long long LL;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
const int mod=1e9 + 7;
int m,K,maxn;
char str[130];
int cnt[130];
void add(LL &a,LL b){ a+=b;if(a>=mod) a-=mod; }
struct mt{
LL v[130][130];
mt(){memset(v,0,sizeof v);}
void init(){memset(v,0,sizeof v);}
mt operator *(const mt &rhs)const{
mt res;
rep(i,0,maxn)rep(j,0,maxn)rep(k,0,maxn)
add(res.v[i][j],v[i][k]*rhs.v[k][j]%mod);
return res;
}
}B,tmp;
mt Pow(mt a,int b){
mt res;
rep(i,0,maxn) res.v[i][i]=1;
for(;b;b>>=1,a=a*a) if(b&1) res=res*a;
return res;
}
int main(){
m=gi(),K=gi();maxn=(1<<m)-1;
scanf("%s",str);
int l=strlen(str);
for(int i=0;i<130;++i) cnt[i]=cnt[i>>1]+(i&1);
rep(i,0,maxn) B.v[i][i]=1;
for(int i=0;i<l;++i){
tmp.init();
rep(a,0,maxn)
rep(b,0,maxn)if(!(cnt[b]&1)){
int S=0;
for(int j=0;j<m;++j){
if(a>>j&1) { S|=(1<<j); continue;}
int x=(b>>j&1),y=j==m-1?str[i]-'0':(b>>j+1)&1;//
if(x>y) goto A;
S|=(x<y)<<j;
}
tmp.v[a][S]++;
A:;
}
B=B*tmp;
}
B=Pow(B,K);
printf("%lld\n",B.v[0][maxn]);
return 0;
}
[BZOJ4851][JSOI2016]位运算[矩阵快速幂]的更多相关文章
- HDU - 2276 位运算矩阵快速幂
挺有意思的一道题 要会运用一些常见的位运算操作进行优化 题目的本质就是要求下面的式子 \(dp[i][j+1]=(dp[i-1][j]+dp[i][j]) \mod 2\) (第\(i\)个字符在\( ...
- bzoj 2326: [HNOI2011]数学作业【dp+矩阵快速幂】
矩阵乘法一般不满足交换律!!所以快速幂里需要注意乘的顺序!! 其实不难,设f[i]为i的答案,那么f[i]=(f[i-1]w[i]+i)%mod,w[i]是1e(i的位数),这个很容易写成矩阵的形式, ...
- cf352E Jeff and Brackets dp+矩阵快速幂(加法+min运算)
题意大致是这样的,一共要放 m 段括号序列,每一段放 n 个括号,也就是放 n*m个括号,再每一段中的 n 个位置分别有放左括号和右括号的代价,问最终摆放出合法的括号序列的最小代价是多少. 另外保证, ...
- HDU4887_Endless Punishment_BSGS+矩阵快速幂+哈希表
2014多校第一题,当时几百个人交没人过,我也暴力交了几发,果然不行. 比完了去学习了BSGS才懂! 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4887 ...
- (中等) CF 576D Flights for Regular Customers (#319 Div1 D题),矩阵快速幂。
In the country there are exactly n cities numbered with positive integers from 1 to n. In each city ...
- BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3286 题意概括 n,m,a,b,c,d,e,f<=10^1000000 题解 神奇的卡常题目 ...
- hihoCoder 1143 : 骨牌覆盖问题·一(递推,矩阵快速幂)
[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形 ...
- 矩阵快速幂(以HDU1757为例)
对于数据量大的求余运算,在有递推式的情况下,可以构造矩阵求解. A - A Simple Math Problem Lele now is thinking about a simple functi ...
- BZOJ 2004 公交线路(状压DP+矩阵快速幂)
注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...
随机推荐
- Oracle EBS OM 创建订单
DECLARE l_header_rec OE_ORDER_PUB.Header_Rec_Type; l_line_tbl OE_ORDER_PUB.Line_Tbl_Type; l_action_r ...
- 缓存那些事-zz
https://tech.meituan.com/cache_about.html 前言 一般而言,现在互联网应用(网站或App)的整体流程,可以概括如图1所示,用户请求从界面(浏览器或App界面)到 ...
- excel文件使用navicat工具导入mysql的方法
1.在excel文件的sheet上,第1行下面插入一行,对应DB里面的字段名称,方便后面导入时做字段匹配: 2.使用Navicat ,打开工具,选择表所在的数据库,然后点击数据库名字,右键Tables ...
- sysbench安装、使用、结果解读
sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.目前sysbench代码托管在github上,项目地址:https://github.c ...
- cat > file << EOF 与 cat > file << -
当我们在使用kickstart 的时候,会遇到写网卡配置文件的情况,这时候我们使用cat > file << EOF 命令等,可以从标准输入中接受输入并保存到 file 文件中. c ...
- How to Be Assertive Asking for What You Want Firmly and Fairly
What Is Assertiveness? It's not always easy to identify truly assertive behavior. This is because th ...
- 转战JS(1) 初探与变量类型、运算符、常用函数与转换
转战JS(1)初探与变量类型.运算符.常用函数与转换 做为一名.NET后台开发人员,正考滤向Web前端开发转型,之前也写过一代前端代码,可是当再回头看JS,并有转向它的意愿的时候,突然发现:原来JS不 ...
- MySQL核心之双一原则
所谓的双一就是指: sync_binlog=; innodb_flush_log_at_trx_commit= innodb_flush_log_at_trx_commit和sync_binlog这两 ...
- 读高性能JavaScript编程 第一章
草草的看完第一章,虽然看的是译文也是感觉涨姿势了, 我来总结一下: 由于 大多数浏览器都是 single process 处理 ui updatas and js execute 于是产生问题: js ...
- 026.6 网络编程 tomcat
###############Tomcat中相关文件作用 bin:启动关闭服务器的脚本 Conf:配置文件 Lib:Tomcat的jar包,只要部署项目到Tomcat,所有项目可共用 ...