LOJ#3119 "CTS2019 |。CTSC2019" 二項ランダムキューブ反転回数+

神はそれがカウント良い質問です。 

コード: 

書式#include <cstdioを> 
書式#include <アルゴリズム> 
書式#include <CStringの>  
#define N 5000003   
#define LL長い長いです    
#defineモッズ998244353   
#define setIO(S)freopenは(S ".IN"、 "R"、標準入力) 
名前空間stdを使用。   
int型invg [N]、DP [N]、F [N]、FAC [N]、INV [N]。   
LL G [N]。  
INT qpow(int型のx、int型のY) 
{ 
    int型TMP = 1; 
    (; Y、Y >> = 1、X =(LL)X * X%のMOD)用 
        もし(Y&1)TMP =(LL)TMP * X%のMOD。 
    tmpに返します。  
} 
C君(Yもしあなたが、X) 
{
    リターン(LL)FAC [X] * INV [Y]%のMOD * INV [XY]%のMOD。  
}
INT INV(INT X){戻りqpow(X、MOD-2)。}   
ボイド(解決) 
{
    整数N、M、L、MI、第k、I、J。  
    scanf関数( "%D%D%D%D"、&N、&M&L、&k番目)。          
    MI =分(分(n、m)は、L)。    
    IF(第k> MI){のprintf( "0 \ n"); リターン; }        
    = 1LLにおけるLL TOT = 1LL * N * M%MOD * 1%のMOD、。
    G [0] TOT = v%と;       
    以下のための式(I = 1; I <= MI; ++ I)   
    { 
        G [I] =(TOT-1LL *(N)*(ml)の%V *(L)%のV + V)%のV。     
        * G IN = IN [I]%のMOD。         
    }           
    invg [M] = qpow(内MOD-2)。      
    invg [I] =(LL)invg [I + 1] * G [I + 1]%のMOD;  - (I; I> = 0 iは、MI-1 =)のために              
    F [0] = 1; 
    F [I + 1] =(LL)F [i]は*(NI)%MOD *(MI)%MOD *(LI)%のMOD;(; I <MI ++ I I = 0)するため    
    以下のために(私は= 0; iが<= MI; ++ I)DP [I] =(LL)F [I] * invgを[I]%MOD。                        
    INT年= 0;  
    (I = k番目; I <= MI; ++ i)が用 
    {
        int型のD =((I-k番目)&1)(MOD-1):1;?            
        (ANS + =(LL)、D * C(I、k番目)%MOD * DP [I]%のMOD)%= MOD。             
    }      
    printf( "%dの\ n" は、ANS)。  
}
空のinit() 
{
    I [0] = 1;
    以下のために(INT iが= 1; I <N; I ++)FAC [i]は=(LL)FAC [I-1] * I%のMOD。
    INV [N-1] = qpow(FAC [N-1]、MOD-2)。
    INV [I] =(LL)INV [I + 1] *(I + 1)%のMOD(; I> = 0 i--をiがN-2 = INT)のために、   
}
メインint型() 
{ 
    // setIO( "入力");  
    初期化(); 
    I、J、Tをint型。 
    scanf関数( "%のD"、&T)。 
    一方、(T--)(解きます)。         
    0を返します。
}    

  

おすすめ

転載: www.cnblogs.com/guangheli/p/12375015.html