警钟敲烂,写代码一定要细
查看原帖
警钟敲烂,写代码一定要细
361708
Pixel_fish楼主2023/12/17 02:48

rt,交了三十遍才发现是代码有这样几点错误,导致自己卡在50pts

以下为AC代码:

#include<bits/stdc++.h>
#define ll long long
#define pause getchar();getchar();
using namespace std;
const ll Mod = 998244353;
using namespace std;
ll N, Q;
ll x, y;
inline void read()
{
	scanf("%lld %lld",&N, &Q);
	return;
}
ll qt_pow(ll b)
{
	long long ans = 1, k = 2;
	while(b)
	{
		if(b % 2 == 1) ans = ans * k % Mod;
		k = k * k % Mod;
		b /= 2ll;
	}
	return ans;
}
void work(ll x_, ll y_)
{
	x_ >>= y_;
	if(y_ > 62 || x_ == 0) {
		printf("%lld\n", qt_pow(N) - 1);
		return;
	}
	bool type_f = x_ & 1;
	do
	{
		x_ >>= 1;
		y_++;
	}
	while((x_ & 1) == type_f);
	printf("%lld\n", qt_pow(y_) - 1);
	return;
}
int main(void)
{
	read();
	for(int i = 0; i < Q; i ++)
	{
		scanf("%lld %lld",&x, &y);
		work(x, y);
	}
	//pause
	return 0;
}
  • 你的快速幂可能使用右移运算

  • 若快速幂幂数是(b/2)这种形式 记得写成 b /= 2ll;

  • do while 循环后y_的值减去了1

  • 若你的N变量为int,且函数内参数类型为long long时,记得更正

  • 忘记取mod或者模数不对

大概就是这些问题了吧...

2023/12/17 02:48
加载中...