zoukankan      html  css  js  c++  java
  • BZOJ1898: [Zjoi2004]Swamp 沼泽鳄鱼

    1898: [Zjoi2004]Swamp 沼泽鳄鱼

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 478  Solved: 286
    [Submit][Status]

    Description

    潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区。每当雨季来临,这里碧波荡漾、生机盎然,引来不少游客。为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥,每座石桥连接着两座石墩,且每两座石墩之间至多只有一座石桥。这个景点造好之后一直没敢对外开放,原因是池塘里有不少危险的食人鱼。豆豆先生酷爱冒险,他一听说这个消息,立马赶到了池塘,想做第一个在桥上旅游的人。虽说豆豆爱冒险,但也不敢拿自己的性命开玩笑,于是他开始了仔细的实地勘察,并得到了一些惊人的结论:食人鱼的行进路线有周期性,这个周期只可能是2,3或者4个单位时间。每个单位时间里,食人鱼可以从一个石墩游到另一个石墩。每到一个石墩,如果上面有人它就会实施攻击,否则继续它的周期运动。如果没有到石墩,它是不会攻击人的。借助先进的仪器,豆豆很快就摸清了所有食人鱼的运动规律,他要开始设计自己的行动路线了。每个单位时间里,他只可以沿着石桥从一个石墩走到另一个石墩,而不可以停在某座石墩上不动,因为站着不动还会有其它危险。如果豆豆和某条食人鱼在同一时刻到达了某座石墩,就会遭到食人鱼的袭击,他当然不希望发生这样的事情。现在豆豆已经选好了两座石墩Start和End,他想从Start出发,经过K个单位时间后恰好站在石墩End上。假设石墩可以重复经过(包括Start和End),他想请你帮忙算算,这样的路线共有多少种(当然不能遭到食人鱼的攻击)。

    Input

    输入文件共M + 2 + NFish行。第一行包含五个正整数N,M,Start,End和K,分别表示石墩数目、石桥数目、Start石墩和End石墩的编号和一条路线所需的单位时间。石墩用0到N–1的整数编号。第2到M + 1行,给出石桥的相关信息。每行两个整数x和y,0 ≤ x, y ≤ N–1,表示这座石桥连接着编号为x和y的两座石墩。第M + 2行是一个整数NFish,表示食人鱼的数目。第M + 3到M + 2 + NFish行,每行给出一条食人鱼的相关信息。每行的第一个整数是T,T = 2,3或4,表示食人鱼的运动周期。接下来有T个数,表示一个周期内食人鱼的行进路线。 如果T=2,接下来有2个数P0和P1,食人鱼从P0到P1,从P1到P0,……; 如果T=3,接下来有3个数P0,P1和P2,食人鱼从P0到P1,从P1到P2,从P2到P0,……; 如果T=4,接下来有4个数P0,P1,P2和P3,食人鱼从P0到P1,从P1到P2,从P2到P3,从P3到P0,……。豆豆出发的时候所有食人鱼都在自己路线上的P0位置,请放心,这个位置不会是Start石墩。

    Output

    输出路线的种数,因为这个数可能很大,你只要输出该数除以10000的余数就行了。 【约定】 1 ≤ N ≤ 50  1 ≤ K ≤ 2,000,000,000  1 ≤ NFish ≤ 20

    Sample Input

    6 8 1 5 3
    0 2
    2 1
    1 0
    0 5
    5 1
    1 4
    4 3
    3 5
    1
    3 0 5 1

    Sample Output

    2

    【样例说明】
    时刻 0 1 2 3
    食人鱼位置 0 5 1 0
    路线一 1 2 0 5
    路线二 1 4 3 5

    如果没有鳄鱼的话。就是求邻接矩阵的k次幂了。

    有鳄鱼的话。比如在第i个时刻第j个点上有鳄鱼。那么把第i-1时刻的矩阵中[1..n][j]置零,第i时刻的矩阵中[j][1..n]置零。很好想通。

    注意到T=2、3、4。lcm是12。那么整个周期就是12。K/12的用快速幂。K%12的暴力求。

      1 //{HEADS
      2 #define FILE_IN_OUT
      3 #define debug
      4 #include <cstdio>
      5 #include <cstring>
      6 #include <cstdlib>
      7 #include <cmath>
      8 #include <ctime>
      9 #include <algorithm>
     10 #include <iostream>
     11 #include <fstream>
     12 #include <vector>
     13 #include <stack>
     14 #include <queue>
     15 #include <deque>
     16 #include <map>
     17 #include <set>
     18 #include <bitset>
     19 #include <complex>
     20 #include <string>
     21 #define REP(i, j) for (int i = 0; i < j; ++i)
     22 #define REPI(i, j, k) for (int i = j; i <= k; ++i)
     23 #define REPD(i, j) for (int i = j; 0 < i; --i)
     24 #define STLR(i, con) for (int i = 0, sz = con.size(); i < sz; ++i)
     25 #define STLRD(i, con) for (int i = con.size() - 1; 0 <= i; --i)
     26 #define CLR(s) memset(s, 0, sizeof s)
     27 #define SET(s, v) memset(s, v, sizeof s)
     28 #define pb push_back
     29 #define PL(k, n) for (int i = 1; i <= n; ++i) { cout << k[i] << ' '; } cout << endl
     30 #define PS(k) STLR(i, k) { cout << k[i] << ' '; } cout << endl
     31 using namespace std;
     32 #ifdef debug
     33 #ifndef ONLINE_JUDGE
     34     const int OUT_PUT_DEBUG_INFO = 1;
     35 #endif
     36 #endif
     37 #ifdef ONLINE_JUDGE
     38     const int OUT_PUT_DEBUG_INFO = 0;
     39 #endif
     40 #define DG if(OUT_PUT_DEBUG_INFO)
     41 void FILE_INIT(string FILE_NAME) {
     42 #ifdef FILE_IN_OUT
     43 #ifndef ONLINE_JUDGE 
     44     freopen((FILE_NAME + ".in").c_str(), "r", stdin);
     45     freopen((FILE_NAME + ".out").c_str(), "w", stdout);
     46 
     47 #endif
     48 #endif
     49 }
     50 typedef long long LL;
     51 typedef double DB;
     52 typedef pair<int, int> i_pair;
     53 const int INF = 0x3f3f3f3f;
     54 //}
     55 
     56 const int  mod = 10000;
     57 const int maxn = 50 + 1;
     58 int n, m, start, end, k, n_fish;
     59 struct Matrix {
     60     int d[maxn][maxn];
     61     Matrix() {
     62         memset(d, 0, sizeof d);
     63     }
     64 }G[12];
     65 int mp[maxn][maxn], p[maxn];
     66 Matrix operator * (Matrix &a, Matrix &b) {
     67     Matrix ret;
     68     REP(i, n) {
     69         REP(j, n) {
     70             REP(k, n) {
     71                 ret.d[i][j] = (ret.d[i][j] + a.d[i][k] * b.d[k][j]) % mod;
     72             }
     73         }
     74     }
     75     return ret;
     76 }
     77 
     78 /*{ 快速幂*/
     79 
     80 Matrix fast_pow(Matrix base, int index) {
     81     Matrix ret;
     82     REP(i, n) {
     83         ret.d[i][i] = 1;
     84     }
     85     for(; index; index >>= 1, base = base * base) {
     86         if(index & 1) {
     87             ret = ret * base;
     88         }
     89     }
     90     return ret;
     91 }
     92 
     93 /*}*/
     94 
     95 int main() {
     96     FILE_INIT("BZOJ1898");
     97 
     98     scanf("%d%d%d%d%d", &n, &m, &start, &end, &k);
     99     for(int a, b; m; --m) {
    100         scanf("%d %d", &a, &b);
    101         mp[a][b] = mp[b][a] = 1;
    102     }
    103     for(int i = 0; i < 12; ++i) {
    104         memcpy(G[i].d, mp, sizeof mp);
    105     }
    106     scanf("%d", &n_fish);
    107     REP(i, n_fish) {
    108         int t;
    109         scanf("%d", &t);
    110         for(int j = 0; j < t; ++j) {
    111             scanf("%d", &p[j]);
    112         }
    113         for(int j = 0; j < 12; ++j) {
    114             int b = p[j % t];
    115             REP(l, n) {
    116                 if(j) {
    117                     G[j - 1].d[l][b] = 0;
    118                 }
    119                 G[j].d[b][l] = 0;
    120             }
    121         }
    122     }
    123     Matrix ans, base;
    124     for(int i = 0; i < n; ++i) {
    125         base.d[i][i] = 1;
    126     }
    127     for(int i = 0; i < 12; ++i) {
    128         base = base * G[i];
    129     }
    130     ans = fast_pow(base, k / 12);
    131     k %= 12;
    132     for(int i = 0; i < k; ++i) {
    133         ans = ans * G[i];
    134     }
    135     printf("%d
    ", ans.d[start][end]);
    136 
    137     return 0;
    138 }
    View Code
  • 相关阅读:
    CodeForces 288A Polo the Penguin and Strings (水题)
    CodeForces 289B Polo the Penguin and Matrix (数学,中位数)
    CodeForces 289A Polo the Penguin and Segments (水题)
    CodeForces 540C Ice Cave (BFS)
    网站后台模板
    雅图CAD
    mbps
    WCF学习-协议绑定
    数据库建表经验总结
    资源位置
  • 原文地址:https://www.cnblogs.com/hzf-sbit/p/3909109.html
Copyright © 2011-2022 走看看