Solution

发现 $x \ xor \  2x = 3x$ 仅当 $x$ 的二进制中没有相邻的 $1$

对于第一个问题就可以进行数位DP 了。

但是对于第二个问题, 我们只能通过递推 打表 来算出答案了。

推公式 打表 可知, 这是一个斐波那契数列, $a_0 = 1, a_1 = 2, a_2 = 3$....

通过矩阵快速幂优化递推就可以过啦

Code

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define rd read()
  5. #define ll long long
  6. using namespace std;
  7.  
  8. const int mod = 1e9 + ;
  9.  
  10. const int N = ;
  11.  
  12. int T, a[];
  13. ll sum[N][], n;
  14.  
  15. struct matrix {
  16. ll s[][];
  17. matrix operator * (const matrix &b) const {
  18. matrix re;
  19. memset(re.s, , sizeof(re.s));
  20. for(int i = ; i <= ; ++i)
  21. for(int k = ; k <= ; ++k)
  22. for(int j = ; j <= ; ++j)
  23. re.s[i][j] = (re.s[i][j] + s[i][k] * b.s[k][j]) % mod;
  24. return re;
  25. }
  26. }ans, st;
  27.  
  28. struct node {
  29. int id;
  30. ll in, out1, out2;
  31. }b[];
  32.  
  33. ll read() {
  34. ll X = , p = ; char c = getchar();
  35. for(; c > '' || c < ''; c = getchar()) if(c == '-') p = -;
  36. for(; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
  37. return X * p;
  38. }
  39.  
  40. ll dfs(int pos, int pre, int lim, int lead) {
  41. if(!pos) return lead == ;
  42. if(!lim && !lead && sum[pos][pre] != -)
  43. return sum[pos][pre];
  44. int up = lim ? a[pos] : ;
  45. ll tmp = ;
  46. for(int i = ; i <= up; ++i) {
  47. if(pre && i)
  48. continue;
  49. tmp += dfs(pos - , i, lim && a[pos] == i, lead && i == );
  50. }
  51. if(!lim && !lead)
  52. sum[pos][pre] = tmp;
  53. return tmp;
  54. }
  55.  
  56. ll work(ll x) {
  57. int len = ;
  58. while(x) a[++len] = x % , x /= ;
  59. return dfs(len , , true, true);
  60. }
  61.  
  62. inline bool cmp1(const node &A, const node &B ) {
  63. return A.in < B.in;
  64. }
  65.  
  66. inline bool cmp2(const node &A, const node &B) {
  67. return A.id < B.id;
  68. }
  69.  
  70. void print(ll x) {
  71. sort(b + , b + + T, cmp1);
  72. memset(sum, -, sizeof(sum));
  73. memset(st.s, , sizeof(st.s));
  74. memset(ans.s, , sizeof(ans.s));
  75. st.s[][] = st.s[][] = st.s[][] = ;
  76. ans.s[][] = ;
  77. ans.s[][] = ;
  78. printf("%lld\n", work(x));
  79. for(; x; x >>= , st = st * st)
  80. if(x & ) ans = ans * st;
  81. printf("%lld\n", (ans.s[][] % mod + mod) % mod);
  82. }
  83.  
  84. int main()
  85. {
  86. T = rd;
  87. for(; T; T--) print(rd);
  88. }

BZOJ 3329 - Xorequ - 数位DP, 矩乘的更多相关文章

  1. BZOJ 3329: Xorequ [数位DP 矩阵乘法]

    3329: Xorequ 题意:\(\le n \le 10^18\)和\(\le 2^n\)中满足\(x\oplus 3x = 2x\)的解的个数,第二问模1e9+7 \(x\oplus 2x = ...

  2. BZOJ 3329 Xorequ (数位DP、矩阵乘法)

    手动博客搬家: 本文发表于20181105 23:18:54, 原地址https://blog.csdn.net/suncongbo/article/details/83758728 题目链接 htt ...

  3. BZOJ 3329: Xorequ(数位dp+递推)

    传送门 解题思路 可以把原式移项得\(x\)^\(2x\)=\(3x\),而\(x+2x=3x\),说明\(x\)二进制下不能有两个连续的\(1\).那么第一问就是一个简单的数位\(dp\),第二问考 ...

  4. BZOJ.3329.Xorequ(数位DP)

    题目链接 x^3x=2x -> x^2x=3x 因为a^b+((a&b)<<1)=a+b,x^2x=x+2x,所以x和2x的二进制表示中不存在相邻的1. (或者,因为x+2x ...

  5. BZOJ 3329 Xorequ 数字DP+矩阵乘法

    标题效果:特定n,乞讨[1,n]内[1,2^n]差多少x满足x^3x=2x x^3x=2x相当于x^2x = 3x 和3x=x+2x 和2x=x<<1 因此x满足条件IFFx&(x ...

  6. bzoj 3329: Xorequ【数位dp+矩阵乘法】

    注意第一问不取模!!! 因为a+b=a|b+a&b,a^b=a|b-a&b,所以a+b=a^b+2(a&b) x^3x==2x可根据异或的性质以转成x^2x==3x,根据上面的 ...

  7. BZOJ3329 Xorequ(数位DP)

    题目大意:x xor 2x=3x(与x xor 3x=2x等价)求满足等式且小于n的x的个数,与满足等式小于2n的数的个数. 因为异或是不进位的二进制加法,那么因为结果正好和加法相同,那么说明x在二进 ...

  8. [BZOJ 3329]Xorequ

    Description 题库链接 给出 \(n\) ,分别求 \(\leq n\) 和 \(\leq 2^n\) 的满足方程 \[x\oplus 3x=2x\] 的正整数解个数. \(1\leq n\ ...

  9. bzoj 3209 bzoj1799 数位dp

    3209: 花神的数论题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2267  Solved: 1040[Submit][Status][Disc ...

随机推荐

  1. Redis安装完后redis-cli无法使用(redis-cli: command not found)已使用

    wget http://download.redis.io/redis-stable.tar.gz(下载redis-cli的压缩包) tar xvzf redis-stable.tar.gz(解压) ...

  2. webstocket 聊天

    /** * 初始化socket **/ function initSocket(index_host){//端口号 if( !window.WebSocket ){ console.log(" ...

  3. 05_ssm基础(六)之SpringMVC

    36.springMVC之入门 1.springMVC简介 Spring MVC是基于MVC模式的一个Web框架,它解决WEB开发中常见的问题(参数接收.文件上传.表单验证.国际化.等等),而且使用简 ...

  4. 05_ssm基础(四)之Spring与持久层的整合

    30.31.spring对jdbc的支持jdbcTemplate 使用Spring的JDBC准备:  1):拷贝jar:       mysql-connector-java-5.1.11.jar:M ...

  5. Retrofit 打印log时,中文会显示类似%E8%BE%BD字符

    https://blog.csdn.net/honghailiang888/article/details/54289632?utm_source=blogxgwz6 参照Android Retrof ...

  6. justify-content & align-items & align-content

    [justify-content & align-items & align-content] 三个属性均作用于container. justify-content用于控制main-a ...

  7. appium+python自动化测试

    appium+python自动化测试 标签(空格分隔): appium 获取APP的包名 1.aapt即Android Asset Packaging Tool,在SDK的build-tools目录下 ...

  8. backdoor-factory

    启动backdoor-factory 寻找大于100字节的代码洞 执行的结果 查看适合的payload程序 iat_reverse_tcp_stager_threaded分片段注入方式 使用这种注入方 ...

  9. document.all 在各浏览器中的支持不同

    转载:https://blog.csdn.net/fengweifree/article/details/16862495 感谢 all 方法最初是由 IE 浏览器拥有的,并不属于 W3C 规范范畴, ...

  10. [1.16更新B14特征处理]津南数字制造题目解读及部分思路~~有趣的特征

    [1.16更新B14特征处理]津南数字制造题目解读及部分思路--有趣的特征 Article onion啦啦啦 2019-01-17 16:03:38 11 1790 11 首先声明,我并不能保证这些特 ...