6461. [02.05] GDOI2020シミュレーションスパニングツリー(木及びその拡張行列、二次元ラグランジュ補間)

タイトル説明

赤、緑、青の色ながら、それぞれ2,3により、図Mに縁なしに、Nポイントを与え。

図は、緑色のxの数を超えていないエッジを満たすために求めているスパニングツリーのこの数は、エッジの数は、青色Y、10 ^ 7 + 9 MODに対する答えを超えません。

1≤N≤40,1≤M≤≤5.1≤3の10°C

行列式

決定DET(A)は、行列Aを定義したり、| A |

\(| A | = \ sum_ {順列P} {( - 逆数1)^ {P} \ PROD {A_ {I、P [I]}}} \)

自然の行​​列

(\ (A \)転置行列\(A ^ T \) \(A \)は交換をランク付け)

\(| A | = | A ^ T | \)

\(| A || B | = | AB | \)

参照してくださいhttps://www.zhihu.com/question/48497108を

\(| \ | A | = X |の線Aは、xを乗じました )

\(| = | |ラインアイテムA J = AJ | + |ラインアイテムA J = BJ | J = AJ + BJの特定のラインアイテム\)

⑤交換が決定基番の隣接する2行となります

シンボルは、各構成を変更しているので

任意の二つの行が決定基番になる⑥スワップ

二十個の数が順番⑤必然的に利用可能になった回数に応じて、2K + 1に切り替えられます

⑦二つの同一の行が決定基である場合には0

それ以外の場合は、2行を交換した後の変化を決定基

⑧決定基定数kによって別の行に1行の後

1に対して斜め左等価、位置kの行列を取り、行列の行列式は、明らかに1であります

そのまま見②よります

⑨上三角行列の行列式は対角の積であります

実際には、できないように上三角行列、逆演算子のみ除去にN ^ 2

上記の定理は、行列ガウスの消去行列式の後に得ることができると

(行の最終結果は、Xのみ乗算xで乗算されることに注意)

行列木定理

補因子式:\(\ M_ {I、J}の)は行列を表す(A \)\第i行j列目の後に残ったマトリックスを除去決定基

キルヒホッフマトリックス:マトリックスの最も単純な形式は、マトリックスの程度度D-隣接行列Cであり、\(D_ {I、I} = \) I度

実際には、マトリクス状の実際の程度は、このようなである:\(D_ {I、I} = \ sum_ I≠{} J {C [I] [J]} \)

だから、CI、jは1でない場合、あるいは多項式も真であります

マトリックスツリー定理=スパニングツリーの数キルヒホッフ任意の補因子行列\(M_ {I、I} \)

私は許可しません

二次元ラグランジュ補間

点YJで既知のx = XI、Y =値\(A_ x_iy_jを} {\)、構成(\ \ sum_ {I、J } {A_ {x_iy_j} F_ {X_I}(X)} G_ {X_I}( X)\)ように\(X = X_I \)場合\(X_I F_ {}(X)= 1 \) そうでない= 0、G共感

一次元及び正確に求めることができ、\(X_I F_ {}(X)= \ J prod_≠{} {I \ X FRAC-X - jが{} {}} X_I-X - jがを\)

問題の解決策

私はこのトピックはタイトルテンプレート上で知っています

コラージュは、三種類1、X、Yを設定する権利、答えがある\(X ^ X-Y ^ Y \ ) の係数(XY入力番号)

列挙XY、補間を計算することができた後決定

コード

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define mod 1000000007
#define Mod 1000000005
#define file
using namespace std;

long long A[41][41];
int a[41][41][3];
long long b[41][41];
long long c[41][41];
long long g[41];
long long ans[41][41];
int f[41];
int F[41];
int n,m,X,Y,i,j,k,l,x,y;
long long s,Ans;

long long qpower(long long a,int b)
{
    long long ans=1;
    
    while (b)
    {
        if (b&1)
        ans=ans*a%mod;
        
        a=a*a%mod;
        b>>=1;
    }
    
    return ans;
}

int main()
{
    freopen("tree.in","r",stdin);
    #ifdef file
    freopen("tree.out","w",stdout);
    #endif
    
    scanf("%d%d%d%d",&n,&m,&X,&Y);
    fo(i,1,m)
    scanf("%d%d%d",&j,&k,&l),--l,++a[j][k][l],++a[k][j][l];
    
    fo(x,0,n-1)
    {
        fo(y,0,n-1)
        {
            A[x][y]=1;
            
            fo(i,1,n)
            {
                b[i][i]=0;
                
                fo(j,1,n)
                if (i!=j)
                b[i][j]=-(a[i][j][0]+a[i][j][1]*x+a[i][j][2]*y),b[i][i]-=b[i][j];
            }
            
            memset(f,0,sizeof(f));
            fo(i,1,n-1)
            {
                fo(j,1,n-1)
                if (b[i][j])
                {
                    if (!f[j])
                    {
                        A[x][y]=A[x][y]*b[i][j]%mod;
                        
                        b[i][j]=qpower(b[i][j],Mod);
                        fo(k,j+1,n-1)
                        b[i][k]=b[i][k]*b[i][j]%mod;
                        b[i][j]=1;
                        
                        f[j]=i;
                        F[i]=j;
                        
                        fo(k,1,i-1)
                        if (F[k]>F[i])
                        A[x][y]=-A[x][y];
                        break;
                    }
                    else
                    {
                        fo(k,j+1,n-1)
                        b[i][k]=(b[i][k]-b[i][j]*b[f[j]][k])%mod;
                        b[i][j]=0;
                    }
                }
                
                if (j>n-1)
                {
                    A[x][y]=0;
                    break;
                }
            }
        }
    }
    
    fo(i,0,n-1)
    {
        c[i][0]=s=1;
        
        fo(j,0,n-1)
        if (i!=j)
        {
            memset(g,0,sizeof(g));
            s=s*(i-j)%mod;
            
            fo(k,0,n-2)
            {
                g[k]=(g[k]-c[i][k]*j)%mod;
                g[k+1]=(g[k+1]+c[i][k])%mod;
            }
            fo(k,0,n-1) c[i][k]=g[k];
        }
        
        s=qpower(s,Mod);
        fo(j,0,n-1)
        c[i][j]=c[i][j]*s%mod;
    }
    
    fo(i,0,n-1)
    {
        memset(g,0,sizeof(g));
        fo(j,0,n-1)
        {
            fo(k,0,n-1)
            g[k]=(g[k]+c[j][k]*A[i][j])%mod;
        }
        
        fo(j,0,n-1)
        {
            fo(k,0,n-1)
            ans[j][k]=(ans[j][k]+c[i][j]*g[k])%mod;
        }
    }
    
    fo(i,0,X)
    {
        fo(j,0,Y)
        Ans=(Ans+ans[i][j])%mod;
    }
    
    printf("%lld\n",(Ans+mod)%mod);
    
    fclose(stdin);
    fclose(stdout);
    
    return 0;
}

おすすめ

転載: www.cnblogs.com/gmh77/p/12359839.html