题意

给定长度为 \(\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|))\).

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
  4. #define rep(i,a,b) for(int i=a;i<=b;++i)
  5. #define pb push_back
  6. typedef long long LL;
  7. inline int gi(){
  8. int x=0,f=1;char ch=getchar();
  9. while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
  10. while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
  11. return x*f;
  12. }
  13. template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
  14. template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
  15. const int mod=1e9 + 7;
  16. int m,K,maxn;
  17. char str[130];
  18. int cnt[130];
  19. void add(LL &a,LL b){ a+=b;if(a>=mod) a-=mod; }
  20. struct mt{
  21. LL v[130][130];
  22. mt(){memset(v,0,sizeof v);}
  23. void init(){memset(v,0,sizeof v);}
  24. mt operator *(const mt &rhs)const{
  25. mt res;
  26. rep(i,0,maxn)rep(j,0,maxn)rep(k,0,maxn)
  27. add(res.v[i][j],v[i][k]*rhs.v[k][j]%mod);
  28. return res;
  29. }
  30. }B,tmp;
  31. mt Pow(mt a,int b){
  32. mt res;
  33. rep(i,0,maxn) res.v[i][i]=1;
  34. for(;b;b>>=1,a=a*a) if(b&1) res=res*a;
  35. return res;
  36. }
  37. int main(){
  38. m=gi(),K=gi();maxn=(1<<m)-1;
  39. scanf("%s",str);
  40. int l=strlen(str);
  41. for(int i=0;i<130;++i) cnt[i]=cnt[i>>1]+(i&1);
  42. rep(i,0,maxn) B.v[i][i]=1;
  43. for(int i=0;i<l;++i){
  44. tmp.init();
  45. rep(a,0,maxn)
  46. rep(b,0,maxn)if(!(cnt[b]&1)){
  47. int S=0;
  48. for(int j=0;j<m;++j){
  49. if(a>>j&1) { S|=(1<<j); continue;}
  50. int x=(b>>j&1),y=j==m-1?str[i]-'0':(b>>j+1)&1;//
  51. if(x>y) goto A;
  52. S|=(x<y)<<j;
  53. }
  54. tmp.v[a][S]++;
  55. A:;
  56. }
  57. B=B*tmp;
  58. }
  59. B=Pow(B,K);
  60. printf("%lld\n",B.v[0][maxn]);
  61. return 0;
  62. }

[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. go语言练习:sha256、sha512哈希算法

    package main import ( "fmt" "crypto/sha256") func main() { str:="test hash. ...

  2. Remove Rar Password OnLine

    How to Remove Rar passwords without any software : One of the most frustrating thing in our digital ...

  3. 页面中 js,css 集中提取

    新增less的定义: /web/webroot/WEB-INF/_ui-src/responsive/lib/ybase-0.1.0/less/ybase.less ​ css定义: /web/web ...

  4. canvas实例_在线画图工具

    fadsfklasdjfklasjdklfjasdlk;fjasd;lfjaskl;dfjal

  5. ES6标准入门之字符串的拓展讲解

    在开始讲解ES6中字符串拓展之前,我们先来看一下ES5中字符串的一些方法. 获取字符串长度 str.length 分割字符串 str.split() 拼接字符串 str1+str2 或 str1.co ...

  6. 解压版中文乱码问题MYSQL中文乱码

    安装的是解压版的MYSQL,具体配置参考:https://jingyan.baidu.com/article/9c69d48f85032f13c9024e15.html . 1:解压之后copy 一个 ...

  7. Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-1-cli

    Docker Machine 是 Docker 官方编排(Orchestration)项目之一,负责在多种平台上快速安装 Docker 环境 Docker Machine是一种工具,它允许你在虚拟主机 ...

  8. DataGuard之Apply Services(redo应用和SQL应用)

    应用服务 Apply Services 根据oracle官方文档整理 http://docs.oracle.com/cd/E11882_01/server.112/e25608/log_apply.h ...

  9. Excel操作

    区间范围计算 方法一:用IF函数 方法二:构建一个辅助区域,用VLOOKUP函数 方法一:用IF函数 在F3中输入:=IF(E3>=90%,5%,IF(E3>=80%,4%,IF(E3&g ...

  10. QT学习笔记8:QDir类及其用法总结

    简介 QDir类提供了访问系统目录结构及其内容的与平台无关的方式. 头文件:#include <qdir.h> QDir类用来操作路径名及底层文件系统,获取关于目录路径及文件的相关信息,也 ...