[CF848D]Shake It!
Shake It!
题解
很容易将原来的要求 
     
      
       
       
         m 
        
       
         − 
        
       
         1 
        
       
      
        m-1 
       
      
    m−1次割得只剩 
     
      
       
       
         1 
        
       
      
        1 
       
      
    1条边的条件转化成整张图的最小割为 
     
      
       
       
         m 
        
       
      
        m 
       
      
    m。
 由于我们最开始已经有了一条连接 
     
      
       
       
         s 
        
       
      
        s 
       
      
    s与 
     
      
       
       
         t 
        
       
      
        t 
       
      
    t的边,所以我们只需要新增加 
     
      
       
       
         1 
        
       
      
        1 
       
      
    1的流量了。
 由于该图的特殊性,我们每次操作都是相对于一条边,新增一个点,连接该边的两个端点,我们很容易想到一种 
     
      
       
       
         d 
        
       
         p 
        
       
      
        dp 
       
      
    dp的方法。
 我们记 
     
      
       
       
         d 
        
        
        
          p 
         
         
         
           i 
          
         
           , 
          
         
           j 
          
         
        
       
      
        dp_{i,j} 
       
      
    dpi,j表示对于一条初始边,我们能够增加 
     
      
       
       
         i 
        
       
      
        i 
       
      
    i条边使之增加 
     
      
       
       
         j 
        
       
      
        j 
       
      
    j的流的方案数。
 但我们可以相对于一条边进行很多次操作,所以如果只用 
     
      
       
       
         d 
        
       
         p 
        
       
      
        dp 
       
      
    dp进行转移是相当麻烦的,我们可以定义一个中间变量, 
     
      
       
        
        
          g 
         
         
         
           i 
          
         
           , 
          
         
           j 
          
         
        
       
      
        g_{i,j} 
       
      
    gi,j表示在我们只对于初始边增加一条边的情况下的方案数,显然,这是可以从 
     
      
       
       
         d 
        
       
         p 
        
       
      
        dp 
       
      
    dp中转移过来的。
 有 
     
      
       
       
         g 
        
       
      
        g 
       
      
    g的转移方程式:
  
      
       
        
         
         
           g 
          
          
          
            i 
           
          
            , 
           
          
            j 
           
          
         
        
          = 
         
         
         
           ∑ 
          
          
          
            k 
           
          
            = 
           
          
            0 
           
          
          
          
            i 
           
          
            − 
           
          
            1 
           
          
         
         
         
           ∑ 
          
          
           
           
             j 
            
           
             ′ 
            
           
          
            = 
           
          
            0 
           
          
         
           k 
          
         
         
         
           ∑ 
          
          
           
           
             j 
            
            
            
              ′ 
             
            
              ′ 
             
            
           
          
            = 
           
          
            0 
           
          
          
          
            i 
           
          
            − 
           
          
            k 
           
          
            − 
           
          
            1 
           
          
         
        
          [ 
         
        
          min 
         
        
           
         
        
          ( 
         
         
         
           j 
          
         
           ′ 
          
         
        
          , 
         
         
         
           j 
          
          
          
            ′ 
           
          
            ′ 
           
          
         
        
          ) 
         
        
          = 
         
        
          j 
         
        
          − 
         
        
          1 
         
        
          ] 
         
        
          d 
         
         
         
           p 
          
          
          
            k 
           
          
            , 
           
           
           
             j 
            
           
             ′ 
            
           
          
         
        
          d 
         
         
         
           p 
          
          
          
            i 
           
          
            − 
           
          
            k 
           
          
            − 
           
          
            1 
           
          
            , 
           
           
           
             j 
            
            
            
              ′ 
             
            
              ′ 
             
            
           
          
         
        
          = 
         
         
         
           ∑ 
          
          
          
            k 
           
          
            = 
           
          
            0 
           
          
          
          
            i 
           
          
            − 
           
          
            j 
           
          
         
         
         
           ∑ 
          
          
           
           
             j 
            
           
             ′ 
            
           
          
            = 
           
          
            j 
           
          
            − 
           
          
            1 
           
          
         
           k 
          
         
        
          ( 
         
        
          1 
         
        
          + 
         
        
          [ 
         
         
         
           j 
          
         
           ′ 
          
         
        
          = 
         
        
          j 
         
        
          − 
         
        
          1 
         
        
          ] 
         
        
          ) 
         
        
          d 
         
         
         
           p 
          
          
          
            k 
           
          
            , 
           
           
           
             j 
            
           
             ′ 
            
           
          
         
        
          d 
         
         
         
           p 
          
          
          
            i 
           
          
            − 
           
          
            k 
           
          
            − 
           
          
            1 
           
          
            , 
           
          
            j 
           
          
            − 
           
          
            1 
           
          
         
        
       
         g_{i,j}=\sum_{k=0}^{i-1}\sum_{j'=0}^{k}\sum_{j''=0}^{i-k-1}[\min(j',j'')=j-1]dp_{k,j'}dp_{i-k-1,j''}=\sum_{k=0}^{i-j}\sum_{j'=j-1}^{k}(1+[j'=j-1])dp_{k,j'}dp_{i-k-1,j-1} 
        
       
     gi,j=k=0∑i−1j′=0∑kj′′=0∑i−k−1[min(j′,j′′)=j−1]dpk,j′dpi−k−1,j′′=k=0∑i−jj′=j−1∑k(1+[j′=j−1])dpk,j′dpi−k−1,j−1
 这部分的转移时间复杂度是 
     
      
       
       
         O 
        
        
        
          ( 
         
         
         
           n 
          
         
           4 
          
         
        
          ) 
         
        
       
      
        O\left(n^4\right) 
       
      
    O(n4)
显然,我们求出 
     
      
       
       
         g 
        
       
      
        g 
       
      
    g之后还需要利用 
     
      
       
       
         g 
        
       
      
        g 
       
      
    g求出我们的 
     
      
       
       
         d 
        
       
         p 
        
       
      
        dp 
       
      
    dp,但我们又得要求我们所有的标号是无序的不同的 
     
      
       
        
        
          g 
         
         
         
           i 
          
         
           , 
          
         
           j 
          
         
        
       
      
        g_{i,j} 
       
      
    gi,j我们可以背包,但相同的就不能了,我们要让这内部也变成无序的。
 我们可以考虑通过组合求出在同一个 
     
      
       
        
        
          g 
         
         
         
           i 
          
         
           , 
          
         
           j 
          
         
        
       
      
        g_{i,j} 
       
      
    gi,j选择了多个的情况。
 假设我们原来有个长度为 
     
      
       
        
        
          g 
         
         
         
           i 
          
         
           , 
          
         
           j 
          
         
        
       
      
        g_{i,j} 
       
      
    gi,j的球序列,我要从中选出可重的 
     
      
       
       
         k 
        
       
      
        k 
       
      
    k个球,我们该怎么用组合数表示方案。
 我们考虑一个一个球地选,不考虑选的顺序,每选一个就在选的这个后面在放一个新球,代表再选一次这个球。
 这样的话,总共会有 
     
      
       
       
         n 
        
       
         + 
        
       
         k 
        
       
      
        n+k 
       
      
    n+k个球,而最后一个球是无论如何也选不到的,可以将其去掉,现在还有 
     
      
       
       
         n 
        
       
         + 
        
       
         k 
        
       
         − 
        
       
         1 
        
       
      
        n+k-1 
       
      
    n+k−1个球,我们会选择 
     
      
       
       
         k 
        
       
      
        k 
       
      
    k个,此时任意一种选球的方案都可以对应回原序列的一种选择方案,而且是一一对应的,所以我们可以用KaTeX parse error: Expected group after '\binom' at end of input: \binom{n+k-1,k}表示我们该问题的答案。
 显然,如果一次转移选择了 
     
      
       
       
         k 
        
       
      
        k 
       
      
    k个 
     
      
       
        
        
          g 
         
         
         
           i 
          
         
           , 
          
         
           j 
          
         
        
       
      
        g_{i,j} 
       
      
    gi,j中的方案,显然,我们最后转移的系数是 
     
      
       
       
         ( 
        
        
         
          
          
            g 
           
           
           
             i 
            
           
             , 
            
           
             j 
            
           
          
         
           + 
          
         
           k 
          
         
           − 
          
         
           1 
          
         
        
          k 
         
        
       
         ) 
        
       
      
        \binom{g_{i,j}+k-1}{k} 
       
      
    (kgi,j+k−1)。
 我们可以像多重背包一样,枚举我们这次转移了多少个 
     
      
       
        
        
          g 
         
         
         
           i 
          
         
           , 
          
         
           j 
          
         
        
       
      
        g_{i,j} 
       
      
    gi,j,通过 
     
      
       
       
         t 
        
       
         m 
        
       
         p 
        
       
      
        tmp 
       
      
    tmp转移 
     
      
       
       
         d 
        
       
         p 
        
       
      
        dp 
       
      
    dp,枚举 
     
      
       
       
         k 
        
       
      
        k 
       
      
    k,让
  
      
       
        
        
          d 
         
         
         
           p 
          
          
          
            i 
           
          
            , 
           
          
            j 
           
          
         
        
          + 
         
        
          = 
         
         
         
           ( 
          
          
           
            
            
              g 
             
             
              
              
                i 
               
              
                ′ 
               
              
             
               , 
              
              
              
                j 
               
              
                ′ 
               
              
             
            
           
             + 
            
           
             k 
            
           
             − 
            
           
             1 
            
           
          
            k 
           
          
         
           ) 
          
         
        
          d 
         
         
         
           p 
          
          
          
            i 
           
          
            − 
           
           
           
             i 
            
           
             ′ 
            
           
          
            k 
           
          
            , 
           
          
            j 
           
          
            − 
           
           
           
             j 
            
           
             ′ 
            
           
          
            k 
           
          
         
        
       
         dp_{i,j}+=\binom{g_{i',j'}+k-1}{k}dp_{i-i'k,j-j'k} 
        
       
     dpi,j+=(kgi′,j′+k−1)dpi−i′k,j−j′k
 实际上我们枚举 
     
      
       
       
         k 
        
       
      
        k 
       
      
    k加转移会贡献的复杂度是 
     
      
       
        
         
         
           n 
          
         
           2 
          
         
        
          1 
         
        
       
         + 
        
        
         
         
           n 
          
         
           2 
          
         
        
          2 
         
        
       
         + 
        
       
         . 
        
       
         . 
        
       
         . 
        
       
         + 
        
        
         
         
           n 
          
         
           2 
          
         
        
          n 
         
        
       
         = 
        
        
        
          n 
         
        
          2 
         
        
       
         ln 
        
       
          
         
       
         n 
        
       
      
        \frac{n^2}{1}+\frac{n^2}{2}+...+\frac{n^2}{n}=n^2\ln\,n 
       
      
    1n2+2n2+...+nn2=n2lnn
 再加上先前枚举 
     
      
       
        
        
          i 
         
        
          ′ 
         
        
       
         , 
        
        
        
          j 
         
        
          ′ 
         
        
       
      
        i',j' 
       
      
    i′,j′的 
     
      
       
        
        
          n 
         
        
          2 
         
        
       
      
        n^2 
       
      
    n2,是 
     
      
       
       
         O 
        
        
        
          ( 
         
         
         
           n 
          
         
           4 
          
         
        
          ln 
         
        
           
          
        
          n 
         
        
          ) 
         
        
       
      
        O\left(n^4\ln\,n\right) 
       
      
    O(n4lnn)。
总时间复杂度 O ( n 4 ln  n ) O\left(n^4\ln\,n\right) O(n4lnn)。
源码
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) (x&-x)
#define reg register
#define pb push_back
#define mkpr make_pair
#define fir first
#define sec second
typedef long long LL;
typedef unsigned long long uLL;     
const LL INF=0x3f3f3f3f3f3f3f3f;  
const int mo=1e9+7;
const int inv2=499122177;
const int jzm=2333;
const int n1=50;
const int zero=10000;
const int orG=3,invG=332748118;
const double Pi=acos(-1.0);
const double eps=1e-5;
typedef pair<LL,int> pii;
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){
	_T f=1;x=0;char s=getchar();
	while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}
	while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}
	x*=f;
}
template<typename _T>
void print(_T x){putchar('\n');while(x>9){putchar((x%10)|'0');x/=10;}putchar(x|'0');}
LL gcd(LL a,LL b){return !b?a:gcd(b,a%b);}
int add(int x,int y,int p){return x+y<p?x+y:x+y-p;}
void Add(int &x,int y,int p){x=add(x,y,p);}
int qkpow(int a,int s,int p){int t=1;while(s){if(s&1LL)t=1ll*a*t%p;a=1ll*a*a%p;s>>=1LL;}return t;}
int n,m,dp[105][105],tmp[105][105],fac[105],inv[105],f[105],d[105];
void init(){
	fac[0]=fac[1]=inv[0]=inv[1]=f[1]=1;
	for(int i=2;i<=100;i++)
		fac[i]=1ll*i*fac[i-1]%mo,
		f[i]=1ll*(mo-mo/i)*f[mo%i]%mo,
		inv[i]=1ll*f[i]*inv[i-1]%mo;
}
int C(int x,int y){
	if(x<0||y<0||x<y)return 0;
	return 1ll*fac[x]*inv[y]%mo*inv[x-y]%mo;
}
signed main(){
	read(n);read(m);m--;init();
	if(n<m){puts("0");return 0;}
	if(n==m){puts("1");return 0;}
	dp[0][0]=1;
	for(int j=1;j<=n;j++){
		for(int i=1;i<=j;i++)
			for(int l=i-1;l<j;l++)
				for(int k=i-1;k<j-l;k++)
					if(l^i-1)Add(tmp[j][i],2ll*dp[k][i-1]*dp[j-k-1][l]%mo,mo);
					else Add(tmp[j][i],1ll*dp[k][i-1]*dp[j-k-1][i-1]%mo,mo);
		for(int l=0;l<=j;l++){
			d[0]=1;
			for(int k=1;k<=n/j;k++)
				d[k]=1ll*f[k]*d[k-1]%mo*(tmp[j][l]+k-1)%mo;
			for(int j1=n;j1>=j;j1--)
				for(int i1=j1;i1>=0;i1--)
					for(int k=1;k<=j1/j;k++)
						Add(dp[j1][i1],1ll*d[k]*dp[j1-k*j][i1-k*l]%mo,mo);
		}
	}
	printf("%d\n",dp[n][m]);
	return 0;
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号