这是我的 dp代码,缺点是枚举是同一深度的所有子树,必然会炸,不知有没有更好的?
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
const int A = 1e7+10;
const int B = 1e6+10;
const int mod = 998244353;
const int inf = 0x3f3f3f3f;
inline int read() {
char c = getchar();
int x = 0, f = 1;
for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
return x * f;
}
int pow_[B]={1},f[B],t;
int lca(int n)
{
int sum=0;
for(int j=pow_[n-1];j<=pow_[n]-1;j++)
{
int ans=0;
for (int i=1;i<=j;i++)
{
int s=j;
int m=i;
if(s==m) {ans+=s;continue;}
while (s!=m)
{
if (s<m) m>>=1;
else if (s>m) s>>=1;
}
ans=ans+s*2%mod;
}
sum=(ans+sum)%mod;
}
return sum%mod;
}
main()
{
for (int i=1;i<=1e6;i++) pow_[i]=pow_[i-1]*2;
f[1]=1;
for (int i=2;i<=8;i++){
f[i]=(f[i-1]+lca(i)%mod)%mod;
//printf("%lld\n",f[i]);
}
t=read();
while (t--){
int s=read();
printf("%lld\n",f[s]%mod);
}
}