P9915
P9915
观察性质题。
我们打一个
可以发现,每一个连通块都有如下性质:
- 形如一个(倒)金字塔。
- 其中一个角是所谓的“直角”。
- 从横着来看,除了最宽的那一层,同宽度的层的层数等于该宽度减一的层数除以
2 。
那么,我们可以推出底部宽为
至此,这道题已经解决了一半。
现在,我们要求的是
可以发现,假设
对于情况
对于情况
注意,当
关于实现,计算 1ll 去左移而不是 1。我因此罚了好几发。
代码
#include <iostream>
using namespace std;
#define MOD 998244353
using ll = unsigned long long;
ll po(ll b, ll p)
{
ll r = 1;
while (p)
{
if (p & 1)
{
r = r * b % MOD;
}
b = b * b % MOD;
p >>= 1;
}
return r;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
ll n;
int q;
cin >> n >> q;
while (q--)
{
ll x, y;
cin >> x >> y;
if (y >= 64)
{
cout << (po(2, n) - 1 + MOD) % MOD << endl;
continue;
}
if (x & (1ll << y))
{
while (x & (1ll << y) && y < n)
{
y++;
}
cout << (po(2, y) - 1 + MOD) % MOD << endl;
}
else
{
while (!(x & (1ll << y)) && y < n)
{
y++;
}
cout << (po(2, y) - 1 + MOD) % MOD << endl;
}
}
return 0;
}