这题可以DP吗
查看原帖
这题可以DP吗
230808
Zxsoul楼主2021/3/6 19:28

这是我的 dpdp代码,缺点是枚举是同一深度的所有子树,必然会炸,不知有没有更好的?

#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);
    }
}
2021/3/6 19:28
加载中...