QT做多語言功能
阿新 • • 發佈:2021-08-06
[TJOI2017]可樂
題目描述
加里敦星球的人們特別喜歡喝可樂。因而,他們的敵對星球研發出了一個可樂機器人,並且放在了加里敦星球的 $1$ 號城市上。這個可樂機器人有三種行為: 停在原地,去下一個相鄰的城市,自爆。它每一秒都會隨機觸發一種行為。現在給加里敦星球城市圖,在第 $0$ 秒時可樂機器人在 $1$ 號城市,問經過了 $t$ 秒,可樂機器人的行為方案數是多少?輸入輸出格式
輸入格式
第一行輸入兩個正整數 N,M。N 表示城市個數,M 表示道路個數。 接下來 $M$ 行每行兩個整數 $u$,$v$,表示 $u$,$v$ 之間有一條道路。保證兩座城市之間只有一條路相連,且沒有任何一條道路連線兩個相同的城市。 最後一行是一個整數 $t$,表示經過的時間。輸出格式
輸入輸出樣例
輸入樣例 #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; }