【HEOI2015] Z小部屋(マトリックスガウス消去ツリー定理&ユークリッド)

【HEOI2015] Z小部屋(luogu)

解決

行列木定理

この質問は、整数を必要とするだけでなく、剰余に

最後に自然に上記の記事によれば、 - 行(列)のマトリクスに加え、別の行(列)のk倍が、行列式の値が変更されていない場合。

私たちは、ユークリッドのアルゴリズムを使用することができます

GCDをAB *(a / b)の重量%bを求める方法

コード

書式#include <cstdioを> 
する#include <cstdlib> 
書式#include <アルゴリズム>
 に#define LL長い長い
 使って 名前空間はstdを、
CONST  INT N = 100 
LL [N] [N]、P = 1E9。
整数N、M、ID [N] [N]、CNT。
チャーS [N]、[N]。
無効アドオン(int型のu、int型V)
{
    [U] [U] ++、[V] [V] ++、[U] [V] - [V] [U] - 
}
解決(int型のn)
{
    LL ANS = 1 以下のためにINT iが= 1 ; I <= N; I ++ 
    {
        int型 K = I + 1、K <= N; K ++ 一方、([K] [i])と
            {
                LL率 = [I] [I] / [K] [i]は、
                INT J = 1 ; J <= nであり、j ++)[I] [J] =([I] [J] -rate * [K] [j]は%P + P)%のP。
                スワップ([I]、[K])、ANS = - ANS。
            } =年* [i]は[I]%のP;
    }
    printf(" %のLLD \ n "、(ANS + P)%のP)。
}
int型のmain()
{
    scanf関数(" %D%D "、&​​N、&M)。
    以下のためにINT iが= 1 ; I <= N; I ++ 
    {
        scanf関数(" %S "、S [I] + 1 )。
        INT J = 1 ; J <= Mであり、j ++ 場合(S [I] [J] == ' ')ID [I] [J] = ++ CNT。
    }
    以下のためにINT iが= 1 ; I <= N; I ++ のためのINT J = 1 ; J <= Mであり、j ++ 
        {
            もし(S [i]の[J] =!' '続けますもし(ID [I + 1 ] [J])を追加し(ID [I] [J]、ID [I + 1 ] [J])。
            もし(ID [I] [J + 1 ])を追加(ID [I] [J]、ID [I] [J + 1 ])。
        }
    (CNT解く - 1 )。
    リターン 0 ;
}

 

 

おすすめ

転載: www.cnblogs.com/hsez-cyx/p/12521921.html