ABC356D 求助
  • 板块学术版
  • 楼主_Weslie_
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/6/2 20:39
  • 上次更新2024/6/2 22:14:27
查看原帖
ABC356D 求助
511959
_Weslie_楼主2024/6/2 20:39

rt,第三组样例代码一直输出 499791830499791830。

#include<bits/stdc++.h>
#define int long long
using namespace std;
long long mier[65]= {1,2,4,8,
                     16,32,64,
                     128,256,512,
                     1024,2048,4096,
                     8192,16384,32768,
                     65536,131072,262144,
                     524288,1048576,2097152,
                     4194304,8388608,16777216,
                     33554432,67108864,134217728,
                     268435456,536870912,1073741824,
                     2147483648,4294967296,8589934592,
                     17179869184,34359738368,68719476736,
                     137438953472,274877906944,549755813888,
                     1099511627776,2199023255552,4398046511104,
                     8796093022208,17592186044416,35184372088832,
                     70368744177664,140737488355328,281474976710656,
                     562949953421312,1125899906842624,2251799813685248,
                     4503599627370496,9007199254740992,18014398509481984,
                     36028797018963968,72057594037927936,144115188075855872,
                     288230376151711744,576460752303423488,1152921504606846976,2305843009213693952
                    };
long long n,m;
int get2(long long x) {
	for(int i=0; i<=60; i++) {
		if(mier[i]>x)return i;
	}
}
int n2,m2,m_[64];
long long ans=0;
signed main() {
	cin>>n>>m;
	n2=get2(n);
	m2=get2(m);
//	cout<<n2<<' '<<m2<<endl;
	int _=-1;
	while(m) {
		m_[++_]=m%2;
		m=m/2;
	}
	int cc;
	cc=min(n2,m2);
	for(int i=0; i<cc; i++) {
		if(m_[i]==1) {
			ans+=((long long)((n/mier[i+1])%998244353)*(mier[i]%998244353))%998244353;
			ans%=998244353;
			if((n%mier[i+1])>mier[i])ans+=(((n%mier[i+1])%998244353)-(mier[i]%998244353))%998244353;
			ans%=998244353;
		}
	}
	cout<<ans;
	return 0;
}

2024/6/2 20:39
加载中...