题意

给定长度为 \(\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]位运算[矩阵快速幂]的更多相关文章

  1. HDU - 2276 位运算矩阵快速幂

    挺有意思的一道题 要会运用一些常见的位运算操作进行优化 题目的本质就是要求下面的式子 \(dp[i][j+1]=(dp[i-1][j]+dp[i][j]) \mod 2\) (第\(i\)个字符在\( ...

  2. bzoj 2326: [HNOI2011]数学作业【dp+矩阵快速幂】

    矩阵乘法一般不满足交换律!!所以快速幂里需要注意乘的顺序!! 其实不难,设f[i]为i的答案,那么f[i]=(f[i-1]w[i]+i)%mod,w[i]是1e(i的位数),这个很容易写成矩阵的形式, ...

  3. cf352E Jeff and Brackets dp+矩阵快速幂(加法+min运算)

    题意大致是这样的,一共要放 m 段括号序列,每一段放 n 个括号,也就是放 n*m个括号,再每一段中的 n 个位置分别有放左括号和右括号的代价,问最终摆放出合法的括号序列的最小代价是多少. 另外保证, ...

  4. HDU4887_Endless Punishment_BSGS+矩阵快速幂+哈希表

    2014多校第一题,当时几百个人交没人过,我也暴力交了几发,果然不行. 比完了去学习了BSGS才懂! 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4887 ...

  5. (中等) 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 ...

  6. BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3286 题意概括 n,m,a,b,c,d,e,f<=10^1000000 题解 神奇的卡常题目 ...

  7. hihoCoder 1143 : 骨牌覆盖问题·一(递推,矩阵快速幂)

    [题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形 ...

  8. 矩阵快速幂(以HDU1757为例)

    对于数据量大的求余运算,在有递推式的情况下,可以构造矩阵求解. A - A Simple Math Problem Lele now is thinking about a simple functi ...

  9. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

随机推荐

  1. 使用redis 处理高并发场景

    1.原理: 当同一个用户获取锁之后,会让该用户一直持有锁.同样 的用户再次获取,会根据原子性 ,lock返回true. /** * 获取锁(非公平锁), 默认获取超时为2分钟 */ public bo ...

  2. go语言开发环境、goland、IDE

    1.下载: https://studygolang.com/dl 可以从这个网址下载,版本根据你的系统来: 64位系统,可以下载推荐版本: 我安装的是32位系统,下载的是下面这个: 如果你的是其他的系 ...

  3. LeetCode题解之 Search in a Binary Search Tree

    1.题目描述 2.问题分析 利用递归遍历二叉查找树. 3.代码 TreeNode* searchBST(TreeNode* root, int val) { if (root == NULL) ret ...

  4. Python tuple

    元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表 语法 names = (a,b,c) 它只有2个方法,一个是count,一个是index. 当然也有可变元祖: 可 ...

  5. M5加密字符串

    private string GetMD5str(string oldStr) { //将输入转换为ASCII 字符编码 ASCIIEncoding enc = new ASCIIEncoding() ...

  6. 调整 Windows VM 的大小

    本文说明如何使用 Azure Powershell 调整在 Resource Manager 部署模型中创建的 Windows VM 的大小. 创建虚拟机 (VM) 后,可以通过更改 VM 大小来扩展 ...

  7. NewEmployeesLearnNotes——新人程序员学习计划V1.1

    百度云链接:https://pan.baidu.com/s/1BzoT79tV1QGwIQTjkGA4CQ 密码:k78i 修改中...

  8. ELF文件结构描述

    ELF目标文件格式最前部ELF文件头(ELF Header),它包含了描述了整个文件的基本属性,比如ELF文件版本.目标机器型号.程序入口地址等.其中ELF文件与段有关的重要结构就是段表(Sectio ...

  9. cisco ASA ios升级或恢复

    cisco ASA ios升级或恢复 一.升级前准备工作 1.准备好所要升级的IOS文件及对应的ASDM文件 2.在一台电脑上架设好tftp,设置好目录,与防火墙进行连接(假设电脑IP为192.168 ...

  10. win10 损坏 bios?

    自从前几个月升级为win10后,主板莫名奇妙的就出问题了,遇到3块不同型号2块技嘉b75,1块微信ph67 技嘉b75-ds3v 技嘉b75m-d3v 微星ph67s-c43 ms-7673 1.0 ...