求时间复杂度分析
  • 板块学术版
  • 楼主__lhx__
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/9/26 16:37
  • 上次更新2024/9/26 20:14:15
查看原帖
求时间复杂度分析
1313782
__lhx__楼主2024/9/26 16:37

rt

  #include<bits/stdc++.h>
  #include <ext/pb_ds/assoc_container.hpp>
  #include <ext/pb_ds/hash_policy.hpp>
  const int N=1e3+10,p=1e9+7;
  __gnu_pbds::gp_hash_table<int,int>f[N];
  int fact[N],n,m,t,ny[N],nyp[N],k;
  inline int max(int x,int y){return x>y?x:y;}
  inline int qum(int a,int b){
      int ans=1;
      while(b){
          (b&1)&&(ans=1ll*ans*a%p);
          a=1ll*a*a%p;
          b>>=1;
      }
      return ans;
  }
  signed main(){
      scanf("%d",&t);fact[0]=1;
      for(int i=1;i<=1000;i++)fact[i]=1ll*fact[i-1]*i%p;
      ny[1000]=qum(fact[1000],p-2);
      for(int i=999;i;i--)ny[i]=1ll*ny[i+1]*(i+1)%p;
      for(int i=1;i<=1000;i++)nyp[i]=1ll*fact[i-1]*ny[i]%p;
      while(t--){
          scanf("%d%d",&n,&m);
          int ans=0;
          for(int i=m-n;i<=m;i++)f[0][i]=1;
          for(k=1;k<=n;k++){
              f[k][1]=ny[k];
              for(int i=max(m-n/k,0);i<=m;i++){
                  for(int j=1;j<=n;j++){
                      f[j][i]=1ll*nyp[j]*i%p*(f[j-1][i]-((j-k-1>=0)?1ll*ny[k]*f[j-k-1][i-1]:0)%p+p)%p;
                  }
              }
              ans=(k^n)?(ans+f[n][m])%p:(1ll*n*f[n][m]%p-ans+p)%p;
          }
          ans=1ll*ans*fact[n]%p;
          printf("%d\n",ans);
      }
  }
2024/9/26 16:37
加载中...