abc354d 求助
  • 板块学术版
  • 楼主eastcloud
  • 当前回复13
  • 已保存回复13
  • 发布时间2024/6/1 21:51
  • 上次更新2024/6/2 08:48:43
查看原帖
abc354d 求助
421265
eastcloud楼主2024/6/1 21:51
// Problem: D - Masked Popcount
// Contest: AtCoder - AtCoder Beginner Contest 356
// URL: https://atcoder.jp/contests/abc356/tasks/abc356_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
#define N 1005
using namespace std;
ll read(){
	ll x=0,f=1;char ch=getchar();
	while(ch<'0' || ch>'9')f=(ch=='-'?-1:1),ch=getchar();
	while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x*f;
}
void write(ll x){
	if(x<0)x=-x,putchar('-');
	if(x/10)write(x/10);
	putchar(x%10+'0');
}
ll qp(ll x,ll y){
	ll ans=1;while(y){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans;
}
int main(){
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
	ll n=read(),m=read(),tmpn=n;
	if(n==0){
		cout<<0;return 0;
	}
	if(n==1){
		cout<<(m&1);
		return 0;
	}
	ll alr=0,res=0;
	while(n){
		ll p=__lg(n),cnt=p;p=(1ll<<p);
		if(p==1){res+=2*alr;if(m&1)res++;res%=mod;break;}
		for(ll j=1;j<p;j<<=1){
			if(!(m&j))continue;
			res=(res+qp(2,cnt-1))%mod;
		}
		res+=(p%mod)*(alr)%mod;res%=mod;
		if(p&m)alr++;n-=p;
	}
	if(tmpn%2==0)res+=__builtin_popcount(tmpn&m),res%=mod;
	write(res);
	return 0;
}

rt,调了一整场,赛后也一直再和题解拍,想问下哪里有问题/ll

2024/6/1 21:51
加载中...