[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 ...
随机推荐
- go语言练习:sha256、sha512哈希算法
package main import ( "fmt" "crypto/sha256") func main() { str:="test hash. ...
- Remove Rar Password OnLine
How to Remove Rar passwords without any software : One of the most frustrating thing in our digital ...
- 页面中 js,css 集中提取
新增less的定义: /web/webroot/WEB-INF/_ui-src/responsive/lib/ybase-0.1.0/less/ybase.less css定义: /web/web ...
- canvas实例_在线画图工具
fadsfklasdjfklasjdklfjasdlk;fjasd;lfjaskl;dfjal
- ES6标准入门之字符串的拓展讲解
在开始讲解ES6中字符串拓展之前,我们先来看一下ES5中字符串的一些方法. 获取字符串长度 str.length 分割字符串 str.split() 拼接字符串 str1+str2 或 str1.co ...
- 解压版中文乱码问题MYSQL中文乱码
安装的是解压版的MYSQL,具体配置参考:https://jingyan.baidu.com/article/9c69d48f85032f13c9024e15.html . 1:解压之后copy 一个 ...
- Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-1-cli
Docker Machine 是 Docker 官方编排(Orchestration)项目之一,负责在多种平台上快速安装 Docker 环境 Docker Machine是一种工具,它允许你在虚拟主机 ...
- DataGuard之Apply Services(redo应用和SQL应用)
应用服务 Apply Services 根据oracle官方文档整理 http://docs.oracle.com/cd/E11882_01/server.112/e25608/log_apply.h ...
- Excel操作
区间范围计算 方法一:用IF函数 方法二:构建一个辅助区域,用VLOOKUP函数 方法一:用IF函数 在F3中输入:=IF(E3>=90%,5%,IF(E3>=80%,4%,IF(E3&g ...
- QT学习笔记8:QDir类及其用法总结
简介 QDir类提供了访问系统目录结构及其内容的与平台无关的方式. 头文件:#include <qdir.h> QDir类用来操作路径名及底层文件系统,获取关于目录路径及文件的相关信息,也 ...