首页 > 其他分享 >abc_356 Masked Popcount

abc_356 Masked Popcount

时间:2024-06-05 15:33:48浏览次数:16  
标签:abc cout sum 356 Popcount Masked mod ll define

#include<bitsstdc++.h>
#define ll long long
#define N 100005
#define mod 998244353
using namespace std;
ll sum_b[N], sum_p[N], p[N], a[N], sum;
void f(ll y){
    ll x = y, t = 1, s = 1;
    while(x){
        if(x%2 == 1) a[t] = 1;
        x /= 2;
        p[t] = s;
        // cout<<"t,p: "<<t<<" "<<p[t]<<endl;
        s = s * 2;
        t++;
    }
    t--;
    sum_b[0] = 1;
    for(int i = 1; i <= t; i++){
        if(a[i] == 1){
            (sum_b[i] = sum_b[i-1] + p[i]) %= mod;
        } 
        else{
            (sum_b[i] = sum_b[i-1] + 0) %= mod;
        }    
        // cout<<"bbb: "<<i<<" "<<sum_b[i]<<endl;
    }
    // cout<<endl;
    for(int i = t; i >= 1; i--){
        if(a[i] == 1)
            (sum_p[i] = sum_p[i+1] + p[i]/2)  %= mod;
        else   
            (sum_p[i] = sum_p[i+1] + 0)  %= mod;
        // cout<<"ppp: "<<i<<" "<<sum_p[i]<<endl;
    }
}
ll n,m;
int main(){
    cin>>n>>m;
    f(n);
    ll k = m, t = 1; 
    while(k){
        if(k%2 == 1){
            // cout<<"t:"<<t<<endl;
            if(a[t] == 0){
                (sum += sum_p[t+1]) %= mod; //前缀和,减1(自己的占位)
            }
            else if(a[t] == 1){ 
                (sum += sum_p[t+1]) %= mod;//前缀和,减1(自己的占位)
                (sum += sum_b[t-1]) %= mod; //后缀和,不减1
                // cout<<sum_p[t+1]<<" "<<sum_b[t-1]<<endl;
            }
        }
        k /= 2;
        t++;
    }
    cout<<sum<<endl;
    return 0;
}
/*
 10010
   110
18 6

  10010
    101
18 5
8+8+1

//一旦a当前为1,则有后缀和,后缀和一定是包含a数字本身的
//一旦a当前为0,则无后缀和,后缀和一定是不包含a数字本身的


8+8+1=17
 10110
   100
22 4
8+2+1


20 4
8+1 = 9
10100
  100


100010110
 01011000

 
*/

标签:abc,cout,sum,356,Popcount,Masked,mod,ll,define
From: https://www.cnblogs.com/caterpillor/p/18233144

相关文章

  • RK3568开发板支持AMP双系统
    RK3568开发板支持AMP双系统   AMP(非对称多处理)是一种计算系统架构,指的是多核处理器中的每个核可以独立工作,并执行不同的任务或运行不同的操作系统。这种特性提升了系统的灵活性和效率,非常适合需要高实时性和特定任务处理的应用场景。可以满足一些特定行业应用,如电力物联网......
  • atcoder ABC 356-B题详解
    atcoderABC356-B题详解ProblemStatementTakahashiishealth-consciousandconcernedaboutwhetherheisgettingenoughofMtypesofnutrientsfromhisdiet.Forthei-thnutrient,hisgoalistotakeatleastAi​unitsperday.Today,heateNfoods......
  • ABC356
    A.SubsegmentReverse模拟代码实现n,l,r=map(int,input().split())l-=1a=list(range(1,n+1))a[l:r]=a[l:r][::-1]print(*a)B.Nutrients模拟代码实现#include<bits/stdc++.h>#definerep(i,n)for(inti=0;i<(n);++i)usingnamespacest......
  • ABC 307 D Mismatched Parentheses
    题解现在有个长度为N的字符串s,其中s由(,)和小写字母组成,每个)都要与其左边的(配成一对,并且将他们和中间的部分给删除掉。输出最后的s思路我们首先设最后的答案为空串,然后模拟整个过程就行了,一旦遇到(,我们就用cnt进行计数。一旦遇到),就在答案里一直删直到遇到最近的(为止。其......
  • ABC 309 E Family and Insurance
    题意一个家庭用一颗树来表示。其中有m个人买了保险,x[i]买的保险可以继承y[i]代,请问有多少人至少有一份保险思路感觉是比较水的E题了,我们采取bfs遍历,然后类似于最短路的想法来更新每个点可以继承的最大保险代数。最后扫一遍所有人,看他们的dis有多少大于等于0,即为答案(dis最初所有......
  • ABC 308E MEX
    题意给定长度为N的包含0,1,2的a序列,和一个长度为N的包含字符M,E,X的字符串s。对于所以符合条件的1<=i<j<k<=N,使得s[i]s[j]s[k]=="MEX"的三元组(i,j,k),请你求出所有mex(a[i],a[j],a[k])之和。mex()函数表示未出现在序列中的最小非负整数。思路我们先看一个非常典的题目,给你一串由a......
  • ABC 310 E NAND repeatedly
    题意太懒了,直接给链接吧,题意挺好懂的。https://atcoder.jp/contests/abc310/tasks/abc310_e思路NAND运算,根据题意,我们可以总结出以下两点:当前结果如果遇到1,那么结果反转(0->1,1->0)当前结果如果遇到0,那么结果赋值为1我们手模一下这个样例1:00110(初始)01011(i==1)×0101(i==......
  • ABC 311 C Find it!
    题意给定一个有向图,其中有N个顶点和N条边。保证其中有一个环,请找出这个环并且输出环上的点。思路我们先将图dfs一遍,遍历到的点我们用map进行标记一下,并且储存在一个数组里面,当我们dfs到一个已经标记过的点时,此时则出现了环。那么如何将这个环输出出来呢?我们这个时候扫一遍刚刚......
  • ABC 312 E Tangency of Cuboids
    题意给定三维空间的n个长方体,每个长方体以其一条体对角线的坐标形式给出,即对于每一个长方体i,其一条体对角线的两个端点的坐标会给出。现在对于每一个给出的长方体,求出其它给出的长方体,与其共面的长方体个数。(保证每个长方体两两不相交)思路首先我们第一个关注的应该是坐标的数......
  • ABC 312 F Cans and Openers
    题意现在有三种物品,给出的格式为(t[i],x[i])如下:拉环罐头,被标记为t[i]=0,得到即食,可以得到x[i]的开心值。普通罐头,被标记为t[i]=1,需要用开罐器打开,食用后可以得到x[i]的开心值。开罐器,被标记为t[i]=2,使用后可以打开x[i]个普通罐头。现在有N个这样的物品,你可以选择其中的......