• CF 1329B Dreamoon Likes Sequences


    传送门

    题目:

    Dreamoon likes sequences very much. So he created a problem about the sequence that you can't find in OEIS:

    You are given two integers d,m find the number of arrays a, satisfying the following constraints:

    • The length of a is n, n≥1
    • 1≤a1<a2<⋯<an≤d
    • Define an array b of length n as follows: b1=a1, ∀i>1,bi=bi−1⊕ai, where ⊕ is the bitwise exclusive-or (xor). After constructing an array b, the constraint b1<b2<⋯<bn−1<bn should hold.

    Since the number of possible arrays may be too large, you need to find the answer modulo m.

    思路:容易想到如果两个数二进制的最高位都是1,则两者"^"后者数值一定比前者小,可以推断出"2^0 ~ 2^1 - 1","2^1 ~ 2^2 - 1",...,"2^(n-1) ~ 2^(n) - 1"为不同集合,我们只需要统计出每个集合的个数,然后求出组合方案数就行。

     1 #include<iostream>
     2 #include<string>
     3 #include<vector>
     4 #include<cstdio>
     5 
     6 #define ll long long
     7 #define pb push_back
     8 
     9 using namespace std;
    10 
    11 const int N = 1e6 + 10;
    12 vector<ll > a;
    13 ll p[N];
    14 ll ans, MOD;
    15 
    16 void init()
    17 {
    18     int x = 0;
    19     while(1){
    20         p[x] = (1 << x) - 1;
    21         if(p[x] > 1e9) break;
    22         x++;
    23      }
    24 }
    25 
    26 
    27 void solve()
    28 {   
    29 
    30     init();
    31 
    32     int T;
    33     cin >> T;
    34     while(T--){
    35        
    36         ans = 1;
    37         a.clear();
    38 
    39         ll n;
    40         cin >> n >> MOD;
    41 
    42         int inx = -1;
    43         for(int i = 1; i < 32; ++i){
    44             if(n >= p[i]) a.pb(p[i] - p[i - 1]);
    45             else{
    46                 inx = i;
    47                 break;
    48             }
    49         }
    50 
    51         if(n - p[inx - 1] > 0) a.pb(n - p[inx - 1]);
    52         for(auto x : a){
    53             ans = (ans * (x + 1)) % MOD;
    54         } 
    55 
    56         ans = (ans - 1 + MOD) % MOD;
    57 
    58         //cout << "(ans = " << ans << ")" << endl;
    59         cout << ans << endl;
    60     }
    61 }
    62 
    63 int main() {
    64 
    65     ios::sync_with_stdio(false);
    66     cin.tie(0);
    67     cout.tie(0);
    68     solve();
    69     //cout << "ok" << endl;
    70     return 0;
    71 }
  • 相关阅读:
    解决Ubuntu 18.04中文输入法的问题,安装搜狗拼音
    POJ 1151 Atlantis 矩形面积求交/线段树扫描线
    [CTF]思维导向图
    Ubuntu Linux 学习篇 配置DHCP服务器
    Ubuntu Linux 学习篇 配置DNS服务器
    Ubuntu Linux DNS服务器 BIND9配置文件命令介绍
    Ubuntu Linux 学习篇 配置DHCP服务器
    Ubuntu Linux 学习篇 配置DNS服务器
    Ubuntu Linux DNS服务器 BIND9配置文件命令介绍
    随记
  • 原文地址:https://www.cnblogs.com/SSummerZzz/p/13514634.html
Copyright © 2020-2023  润新知