ICode9

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

cf1330 D. Dreamoon Likes Sequences(计数)

2021-10-22 12:33:59  阅读:191  来源: 互联网

标签:le cf1330 int ans cin Likes Sequences 最高 位为


https://codeforces.com/contest/1330/problem/D

题意:

数组 \(a_i\) 严格递增,\(1\le a_i \le n\) 。用 \(a_i\) 构造 \(b_i\): \(b_1=a_1\); \(b_i = b_{i-1}\) \(xor\) \(a_i\)。要求 \(b_i\) 也严格递增。问这样的数组 \(a_i\) 有多少

思路:

如果相邻两个 \(a_i\) 的二进制最高位相同,那么 \(b_i\) 将失去这一位。所以每个 \(a_i\) 的最高位都要不同

记最右边为第 \(0\) 位,则 \(n\) 的最高位为 \(d=log_2(n)\) 。可以这样构造出 \(a_i\) :选1或0个最高位为 \(0\) 的数,再选1或0个最高位为 \(1\) 的数,一直选到 \(d\) 位

“选1或0个最高位为 \(i\) 的数” 有 \(2^i+1\) 种可能,“选1或0个最高位为 \(d\) 的数” 有 \((n-(1<<d)+1)+1\) 种可能。全部乘起来即可。注意全都选0个是不行的,所以 ans-1

#include <bits/stdc++.h>
using namespace std;

signed main()
{
    int T; cin >> T; while(T--)
    {
        int n, m; cin >> n >> m;
        int d = log2(n), ans = 1;
        for(int i = 0; i < d; i++)
            ans = 1ll * ans * (((1<<i)+1) % m) % m;
        ans = 1ll * ans * ((n - (1<<d) + 2) % m) % m;
        cout << (ans-1+m)%m << '\n';
    }

    return 0;
}

标签:le,cf1330,int,ans,cin,Likes,Sequences,最高,位为
来源: https://www.cnblogs.com/wushansinger/p/15438234.html

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

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

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

ICode9版权所有