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或者模数不对
大概就是这些问题了吧...