【題解】[牛客網NOIP賽前集訓營-提高組(第五場)]A.同餘方程 位運算
阿新 • • 發佈:2018-11-01
#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; }
總結
各種位運算操作