牛客练习赛54-A 乘积
找规律+快速幂
解析:可以发现Ai & Aj = min(Ai, Aj)
然后枚举 i 试着写一下公式
很容易找到规律,将上述 枚举 i 得到的结果再连乘 得到以下结果,照着敲就好了(快速幂可以去看一下其他的博客,这里就不介绍了)
这里贴一下代码
#include <iostream>
using namespace std;
typedef unsigned long long ll;
const int mod = 998244353;
ll a[65];
ll ksm(ll x, ll n){
if(x==1)return 1;
ll ans=1;
while(n){
if(n&1)ans = ans*x%mod;
x = x*x%mod;
n >>= 1;
}
return ans;
}
int main(){
a[1] = 1;
for(ll i=1; i<=63; i++){
a[i+1] = (1ll<<i) | a[i];
a[i+1] %= mod;
}
int t;
cin >> t;
while(t--){
int n;
cin >> n;
ll ans=1;
for(int i=1; i<=n; i++){
ans = ans*ksm(a[i], (n-i)*2+1)%mod;
}
cout << ans << endl;
}
}