ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

arc141 B - Increasing Prefix XOR

2022-06-07 14:00:44  阅读:208  来源: 互联网

标签:le XOR 60 严格 arc141 位数 大于 implies Increasing


题意:

给定 \(n,m\),问有多少数组 \(a[]\) 满足:

  • \(1\le a_1< a_2 < \cdots < a_n \le m\)
  • \(b_1<b_2<\cdots <b_n\),其中 \(b[]\) 为前缀异或和即 \(b_i=a_1\oplus a_2\oplus \cdots \oplus a_i\)

\(1\le n \le m<2^{60}\)

思路:

\(a_i<a_{i+1}\) 则 \(a_{i+1}\) 的位数不少于 \(a_i\) 的位数(位数指二进制位数)

\(b_i<b_{i+1}=b_i\oplus a_{i+1}\) 则 \(a_{i+1}\) 的位数不等于 \(b_i\) 的位数

所以若 \(a_i\) 和 \(b_i\) 有相同的位数,则 \(a_{i+1}\) 的位数严格大于 \(a_i\) 和 \(b_i\) 的位数

而 \(a_1=b_1\implies a_1\) 和 \(b_1\) 位数相同 \(\implies a_2\) 的位数严格大于 \(a_1,b_1\) 的位数 \(\implies b_2\) 的位数等于 \(a_2\) 的位数

以此类推得 \(a_i\) 的位数严格递增就行了!

因为 \(m<2^{60}\) 所以 \(m\) 最多有 60 位,所以当 \(n>60\) 时答案为 0

\(n\le 60\) 时 dp 一下:\(f(i,j)\) 表示 \(n=i\),\(a_i\) 有 \(j\) 位

ll n, m, f[N][N], g[N]; //恰有i位的数有几个
void sol()
{
    cin >> n >> m;
    if (n > 60)
        return cout << 0, void();
    int dig = log2(m) + 1;

    g[dig] = m; //预处理g[]
    for (int i = 1; i < dig; i++)
        g[i] = qmi(2, i - 1), g[dig] = add(g[dig], -g[i]);

    f[0][0] = 1;
    for (int i = 1; i <= n; i++)
        for (int j = i; j <= dig; j++)    //当前位数
            for (int k = 0; k < j; k++) //上一个位数
                f[i][j] = add(f[i][j], mul(g[j], f[i - 1][k]));

    ll ans = 0;
    for (int i = 1; i <= dig; i++)
        ans = add(ans, f[n][i]);
    cout << ans;
}

标签:le,XOR,60,严格,arc141,位数,大于,implies,Increasing
来源: https://www.cnblogs.com/wushansinger/p/16351522.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有