1. 程式人生 > 其它 >QT做多語言功能

QT做多語言功能

[TJOI2017]可樂

題目描述

加里敦星球的人們特別喜歡喝可樂。因而,他們的敵對星球研發出了一個可樂機器人,並且放在了加里敦星球的 $1$ 號城市上。這個可樂機器人有三種行為: 停在原地,去下一個相鄰的城市,自爆。它每一秒都會隨機觸發一種行為。現在給加里敦星球城市圖,在第 $0$ 秒時可樂機器人在 $1$ 號城市,問經過了 $t$ 秒,可樂機器人的行為方案數是多少?

輸入輸出格式

輸入格式

第一行輸入兩個正整數 N,M。N 表示城市個數,M 表示道路個數。 接下來 $M$ 行每行兩個整數 $u$,$v$,表示 $u$,$v$ 之間有一條道路。保證兩座城市之間只有一條路相連,且沒有任何一條道路連線兩個相同的城市。 最後一行是一個整數 $t$,表示經過的時間。

輸出格式

輸出可樂機器人的行為方案數,答案可能很大,請輸出對 $2017$ 取模後的結果。

輸入輸出樣例

輸入樣例 #1

3 2
1 2
2 3
2

輸出樣例 #1

8

構造出整張圖的 0 - 1鄰接矩陣 E, 令E自乘t次得到新矩陣G. G[x][y]表示 x 走 t 步到 y 的方案數


#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int n, m;

const int N  = 35, mod = 2017;

int f[N][N], g[N][N];

int t;

struct Martix
{
    int f[N][N];
    void clear()
    {
        memset(f, 0, sizeof f);
    }

    Martix operator*(const Martix b)
    {
        Martix c;
        c.clear();
        for(int i = 0; i <= 30; i++)
        {
            for(int k = 0 ;k <= 30; k++)
            {
                for(int j = 0; j <= 30; j++)
                {
                    c.f[i][j] += f[i][k] * b.f[k][j];
                    c.f[i][j] %= mod;
                }
            }
        }
        return c;
    }

}E;

Martix qp(Martix a,int b)
{
    Martix res = E;
    b--;
    while(b)
    {
        if(b & 1) res = res * a;
        a = a * a;
        b >>= 1;
    }
    return res;

}
int main()
{
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; i++)
    {
        int u, v;
        scanf("%d %d", &u, &v);
        E.f[u][v] = E.f[v][u] = 1;
    }

    for(int i = 0; i <= n; i++)
    {
        E.f[i][i] = 1;
        E.f[i][0] = 1;
    }

    scanf("%d", &t);

    E = qp(E, t );   
    int ans = 0;
    for(int i = 0; i <= n; i++)
    {
        ans += E.f[1][i];
        ans %= mod;
    }

    printf("%d", ans);
    return 0;

}