【题解】[牛客网NOIP赛前集训营-提高组(第五场)]A.同余方程 位运算

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll m,l1,l2,r1,r2;
ll get(ll l,ll r){return r/m-(l==0?-1:(l-1)/m);}
ll cal(ll l,ll r)
{
	ll ans=0;
	for(ll i=l;i;i=i&(i-1))
	    for(ll j=r;j;j=j&(j-1))//枚举子集操作 
	    {
	    	ll x=i&-i,y=j&-j;//取出二进制下最低位的1
			ll mx=max(x,y),mn=min(x,y),L=((i&(i-1)^(j&j-1))&(~(mx-1))),R=L+mx-1;//取出前半截
			ans=(ans+get(L,L+mx-1)%mod*(mn%mod)%mod)%mod; 
		}
	return ans;
}
int main()
{
	//freopen("in.txt","r",stdin);
    scanf("%lld%lld%lld%lld%lld",&l1,&r1,&l2,&r2,&m);r1++;r2++;
    printf("%lld\n",(cal(r1,r2)-cal(l1,r2)-cal(r1,l2)+cal(l1,l2)+2*mod)%mod);
    return 0;
}

总结

各种位运算操作

猜你喜欢

转载自blog.csdn.net/qq_41958841/article/details/83573021