結果

問題 No.3635 Probability trip
コンテスト
ユーザー snrnsidy
提出日時 2026-08-21 22:16:55
言語 C++17
(gcc 15.2.0 + boost 1.90.0)
コンパイル:
g++-15 -O2 -lm -std=c++17 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 74 ms / 2,000 ms
+ 147µs
コード長 2,793 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,386 ms
コンパイル使用メモリ 231,916 KB
実行使用メモリ 9,352 KB
最終ジャッジ日時 2026-08-21 22:17:01
合計ジャッジ時間 4,966 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 43
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>

using namespace std;

const long long int MOD = 998244353;

long long int mypow(long long int x,long long int n)
{
	long long int res = 1;
	while(n > 0)
	{
		if(n%2==1)
		{
			res*=x;
			res%=MOD;
		}
		x*=x;
		x%=MOD;
		n/=2;
	}
	return res;
}

vector<vector<long long int>> mul(vector<vector<long long int>> A, vector<vector<long long int>> B)
{
	int n = A.size();
	int m = B.size();
	int k = B[0].size();

	vector<vector<long long int>> C(n,vector<long long int>(k,0));
	for(int i=0;i<n;i++)	
	{
		for(int j=0;j<k;j++)
		{
			for(int a=0;a<m;a++)
			{
				C[i][j] += ((A[i][a]*B[a][j])%MOD);
				C[i][j]%=MOD;
			}
		}
	}
	return C;
}

int n,m,a,b;
bool chk[50][50];
long long int s,t;
long long int p[50][50];

int main(void)
{
	cin.tie(0);
	ios::sync_with_stdio(false);

    cin >> n >> m;
    for(int i=0;i<m;i++)
    {
        cin >> a >> b;
        a-=1;
        b-=1;
        chk[a][b] = true;
        chk[b][a] = true;
    }
    cin >> s >> t >> a >> b;
    a-=1;
    b-=1;

    for(int i=0;i<n;i++)
    {
        int cnt = 0;
        for(int j=0;j<n;j++)
        {
            if(chk[i][j]) cnt += 1;
        }

        for(int j=0;j<n;j++)
        {
            if(chk[i][j])
            {
                p[i][j] = 1;
                p[i][j]*=mypow(cnt,MOD-2);
                p[i][j]%=MOD;
            }
        }
    }

	vector<vector<long long int>> A(n,vector<long long int>(n,0));
	vector<vector<long long int>> B(n,vector<long long int>(1,0));

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            A[j][i] = p[i][j];
        }
    }

    B[0][0] = 1;

    long long int N = t - 1;
    while(N > 0)
    {
        if(N%2==1)
        {
            B = mul(A,B);
        }
        A = mul(A,A);
        N/=2;
    }

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            A[i][j] = 0;
        }
    }
    long double val = B[b][0];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            A[j][i] = p[i][j];
        }
        B[i][0] = 0;
    }

    B[b][0] = val;

    N = s - t;
    while(N > 0)
    {
        if(N%2==1)
        {
            B = mul(A,B);
        }
        A = mul(A,A);
        N/=2;
    }
    
    long long int X = B[a][0];
    
    N = s-1;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            A[i][j] = 0;
        }
    }

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            A[j][i] = p[i][j];
        }
        B[i][0] = 0;
    }

    B[0][0] = 1;

    while(N > 0)
    {
        if(N%2==1)
        {
            B = mul(A,B);
        }
        A = mul(A,A);
        N/=2;
    }    

    long long int Y = B[a][0];
    X*=mypow(Y,MOD-2);
    X%=MOD;

    cout << X << '\n';

	return 0;
}
0