绍兴一中模拟赛2.18——切蛋糕
Description

Solution
令 n = h + w n=h+w n=h+w
1. O ( n 2 ) 1.O(n^2) 1.O(n2)
枚举行数
    
     
      
       
        i
       
      
      
       i
      
     
    i和列数
    
     
      
       
        j
       
      
      
       j
      
     
    j,
 
    
     
      
       
        
         P
        
        
         h
        
        
         i
        
       
      
      
       P_h^i
      
     
    Phi代表
    
     
      
       
        h
       
      
      
       h
      
     
    h行里选了
    
     
      
       
        i
       
      
      
       i
      
     
    i行的排列(与顺序无关,所以是排列)
 
    
     
      
       
        
         P
        
        
         w
        
        
         j
        
       
      
      
       P_w^j
      
     
    Pwj同理
 但是两个排列只枚举了行与行和列与列之间的先后顺序,还不知道整个的先后顺序,那么再乘上一个
    
     
      
       
        
         C
        
        
         
          i
         
         
          +
         
         
          j
         
        
        
         i
        
       
      
      
       C_{i+j}^i
      
     
    Ci+ji就得到了整个的方案数
 
    
     
      
       
        (
       
       
        i
       
       
        +
       
       
        1
       
       
        )
       
       
        (
       
       
        j
       
       
        +
       
       
        1
       
       
        )
       
      
      
       (i+1)(j+1)
      
     
    (i+1)(j+1)为此时的贡献
 很多人会以为这样就好了,但事实上因为过程中的答案统计的不一定只有一次,所以每个方案要乘上它接下来的方案个数
    
     
      
       
        
         P
        
        
         
          n
         
         
          −
         
         
          i
         
         
          −
         
         
          j
         
        
        
         
          k
         
         
          −
         
         
          i
         
         
          −
         
         
          j
         
        
       
      
      
       P_{n-i-j}^{k-i-j}
      
     
    Pn−i−jk−i−j(
    
     
      
       
        i
       
       
        +
       
       
        j
       
      
      
       i+j
      
     
    i+j表示当前总操作次数,
    
     
      
       
        k
       
       
        −
       
       
        i
       
       
        −
       
       
        j
       
      
      
       k-i-j
      
     
    k−i−j为剩下的操作次数),配张图:
 
 这张图代表了答案的计算过程
 我们发现
    
     
      
       
        1
       
       
        ,
       
       
        2
       
       
        ,
       
       
        3
       
      
      
       1,2,3
      
     
    1,2,3这三个点都经过了
    
     
      
       
        2
       
      
      
       2
      
     
    2次,要把这个东西统计进去
 
     
      
       
        
         a
        
        
         n
        
        
         s
        
        
         =
        
        
         
          ∑
         
         
          
           i
          
          
           =
          
          
           0
          
         
         
          h
         
        
        
         
          ∑
         
         
          
           j
          
          
           =
          
          
           0
          
         
         
          w
         
        
        
         
          P
         
         
          h
         
         
          i
         
        
        
         
          P
         
         
          w
         
         
          j
         
        
        
         
          C
         
         
          
           i
          
          
           +
          
          
           j
          
         
         
          i
         
        
        
         (
        
        
         i
        
        
         +
        
        
         1
        
        
         )
        
        
         (
        
        
         j
        
        
         +
        
        
         1
        
        
         )
        
        
         
          P
         
         
          
           n
          
          
           −
          
          
           i
          
          
           −
          
          
           j
          
         
         
          
           k
          
          
           −
          
          
           i
          
          
           −
          
          
           j
          
         
        
       
       
        ans=\sum_{i=0}^h\sum_{j=0}^wP_h^iP_w^jC_{i+j}^i(i+1)(j+1)P_{n-i-j}^{k-i-j}
       
      
     ans=i=0∑hj=0∑wPhiPwjCi+ji(i+1)(j+1)Pn−i−jk−i−j
2. O ( n l o g n ) 2.O(nlogn) 2.O(nlogn)
把上式的
    
     
      
       
        a
       
       
        n
       
       
        s
       
      
      
       ans
      
     
    ans拆开来,得到:
 
     
      
       
        
         a
        
        
         n
        
        
         s
        
        
         =
        
        
         
          
           h
          
          
           !
          
          
           w
          
          
           !
          
          
           (
          
          
           n
          
          
           −
          
          
           i
          
          
           −
          
          
           j
          
          
           )
          
          
           !
          
          
           (
          
          
           i
          
          
           +
          
          
           j
          
          
           )
          
          
           !
          
          
           (
          
          
           i
          
          
           +
          
          
           1
          
          
           )
          
          
           (
          
          
           j
          
          
           +
          
          
           1
          
          
           )
          
         
         
          
           i
          
          
           !
          
          
           j
          
          
           !
          
          
           (
          
          
           h
          
          
           −
          
          
           i
          
          
           )
          
          
           !
          
          
           (
          
          
           w
          
          
           −
          
          
           j
          
          
           )
          
          
           !
          
          
           n
          
          
           !
          
         
        
       
       
        ans=\frac{h!w!(n-i-j)!(i+j)!(i+1)(j+1)}{i!j!(h-i)!(w-j)!n!}
       
      
     ans=i!j!(h−i)!(w−j)!n!h!w!(n−i−j)!(i+j)!(i+1)(j+1)
 这东西可以用
    
     
      
       
        F
       
       
        F
       
       
        T
       
      
      
       FFT
      
     
    FFT优化
3. O ( l o g n ) 3.O(logn) 3.O(logn)
考虑到我们要统计矩形的个数,那么只要统计左下角同时被行列两条线经过(边界的点默认已经被边界线经过)的个数即可
 那么,在计算第
    
     
      
       
        i
       
      
      
       i
      
     
    i次分割的时候,不在边界上的点有
    
     
      
       
        
         
          C
         
         
          i
         
         
          2
         
        
        
         
          C
         
         
          n
         
         
          2
         
        
       
      
      
       \frac{C_i^2}{C_n^2}
      
     
    Cn2Ci2的概率被两条线切到(每次分割都会选怎么切,切到的两个数同时
    
     
      
       
        ≤
       
       
        i
       
      
      
       ≤i
      
     
    ≤i的个数为
    
     
      
       
        
         C
        
        
         i
        
        
         2
        
       
      
      
       C_i^2
      
     
    Ci2个,而切到数
    
     
      
       
        ≤
       
       
        n
       
      
      
       ≤n
      
     
    ≤n的个数为
    
     
      
       
        
         C
        
        
         n
        
        
         2
        
       
      
      
       C_n^2
      
     
    Cn2,所以概率为
    
     
      
       
        
         
          C
         
         
          i
         
         
          2
         
        
        
         
          C
         
         
          n
         
         
          2
         
        
       
      
      
       \frac{C_i^2}{C_n^2}
      
     
    Cn2Ci2)
 而这样的点有
    
     
      
       
        h
       
       
        w
       
      
      
       hw
      
     
    hw个,所以总数为
    
     
      
       
        
         
          (
         
         
          k
         
         
          −
         
         
          1
         
         
          )
         
         
          k
         
         
          (
         
         
          k
         
         
          +
         
         
          1
         
         
          )
         
         
          h
         
         
          w
         
        
        
         
          3
         
         
          n
         
         
          (
         
         
          n
         
         
          −
         
         
          1
         
         
          )
         
        
       
      
      
       \frac{(k-1)k(k+1)hw}{3n(n-1)}
      
     
    3n(n−1)(k−1)k(k+1)hw
 对于在边界上,但不是左下角的点,概率为
    
     
      
       
        
         i
        
        
         n
        
       
      
      
       \frac{i}{n}
      
     
    ni总共
    
     
      
       
        n
       
      
      
       n
      
     
    n个,总数为
    
     
      
       
        
         
          k
         
         
          (
         
         
          k
         
         
          +
         
         
          1
         
         
          )
         
        
        
         2
        
       
      
      
       \frac{k(k+1)}{2}
      
     
    2k(k+1)
 左下角那个点每次概率为
    
     
      
       
        1
       
      
      
       1
      
     
    1,
    
     
      
       
        k
       
      
      
       k
      
     
    k次后,总数为
    
     
      
       
        k
       
      
      
       k
      
     
    k
 所以:
     
      
       
        
         a
        
        
         n
        
        
         s
        
        
         =
        
        
         
          
           (
          
          
           k
          
          
           −
          
          
           1
          
          
           )
          
          
           k
          
          
           (
          
          
           k
          
          
           +
          
          
           1
          
          
           )
          
          
           h
          
          
           w
          
         
         
          
           3
          
          
           n
          
          
           (
          
          
           n
          
          
           −
          
          
           1
          
          
           )
          
         
        
        
         +
        
        
         
          
           k
          
          
           (
          
          
           k
          
          
           +
          
          
           1
          
          
           )
          
         
         
          2
         
        
        
         +
        
        
         k
        
       
       
        ans=\frac{(k-1)k(k+1)hw}{3n(n-1)}+\frac{k(k+1)}{2}+k
       
      
     ans=3n(n−1)(k−1)k(k+1)hw+2k(k+1)+k
Code
过程中有 0 0 0的话要特判掉
#include<bits/stdc++.h>
using namespace std;
const int M=1e9+7;
long long h,w,k;
int n;
int pw(int x,int y){
	int z=1;
	for (;y;y>>=1,x=1ll*x*x%M)
		if (y&1) z=1ll*z*x%M;
	return z;
}
int main(){
	scanf("%lld%lld%lld",&h,&w,&k);
	h%=M,w%=M,k%=M,n=(h+w)%M;
	printf("%lld",(1ll*k*(k+1)%M*(k-1)%M*((M+1)/3)%M*(h?h:1)%M*(w?w:1)%M*(n==1?1:pw(1ll*n*(n-1)%M,M-2))+1ll*k*(k+1)/2+k)%M);
}
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号