zoukankan      html  css  js  c++  java
  • Flea Circus(Project Euler 213)

    original version

    hackerrank programming version

    题目大意是N*N的格子,每个格子一开始有1个跳蚤,每过单位时间跳蚤会等概率向四周跳,问M秒后空格子的期望个数。

    题解:

    对于每个跳蚤暴力模拟每一秒,算出M秒后它到各个格子的概率最后统计就好了,hackerrank上的版本需要常数优化,比如根据对称性只考虑左上四分之一块矩形.

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 
      4 typedef long long LL;
      5 const int mod = 1e9 + 7;
      6 #define MAXN 42
      7 #define MP make_pair
      8 const int INF = 1e9 + 10;
      9 
     10 int n, m;
     11 int s[MAXN][MAXN], tmp[MAXN][MAXN], cnt[MAXN][MAXN];
     12 LL p[MAXN][MAXN];
     13 int dx[] = {0, 0, -1, 1};
     14 int dy[] = {1, -1, 0, 0};
     15 int inv[5];
     16 
     17 
     18 int power(int x, int p)
     19 {
     20     int res = 1;
     21     for (; p; p >>= 1)
     22     {
     23         if (p & 1) res = 1LL * res * x % mod;
     24         x = 1LL * x * x % mod;
     25     }
     26     return res;
     27 }
     28 
     29 void work(int sx, int sy)
     30 {
     31     for (int i = 1; i <= n; ++i)
     32         for (int j = 1; j <= n; ++j)
     33             s[i][j] = 0;
     34     s[sx][sy] = 1;
     35      
     36     int x, y;
     37     for (int _m = 1; _m <= m; ++_m)
     38     {
     39         for (int i = 1; i <= n; ++i)
     40             for (int j = 1; j <= n; ++j)
     41                 tmp[i][j] = 0;
     42         for (int i = 1; i <= n; ++i)
     43         {
     44             for (int j = 1; j <= n; ++j)
     45             {
     46                 for (int d = 0; d < 4; ++d)
     47                 {
     48                     x = i + dx[d];
     49                     y = j + dy[d];
     50                     (tmp[x][y] += 1LL * cnt[i][j] * s[i][j] % mod) %= mod;
     51                 }
     52             }
     53         }
     54         for (int i = 1; i <= n; ++i)
     55             for (int j = 1; j <= n; ++j)
     56                 s[i][j] = tmp[i][j];
     57     }
     58     int t;
     59     for (int i = 1; i <= n; ++i)
     60     {
     61         for (int j = 1; j <= n; ++j)
     62         {
     63             t = 1 - s[i][j] + mod;
     64             (p[i][j] *= t) %= mod;
     65             (p[n + 1 - i][j] *= t) %= mod;
     66             (p[i][n + 1 - j] *= t) %= mod;
     67             (p[n + 1 - i][n + 1 - j] *= t) %= mod;
     68         }
     69     }
     70 }
     71 
     72 
     73 
     74 int main() 
     75 {
     76     //freopen("in.txt", "r", stdin);
     77     //freopen("out.txt", "w", stdout);
     78 
     79     inv[1] = 1;
     80     inv[2] = power(2, mod - 2);
     81     inv[3] = power(3, mod - 2);
     82     inv[4] = power(4, mod - 2);
     83     
     84     int T, x, y;
     85     scanf("%d", &T);
     86     while (T--)
     87     {
     88         scanf("%d %d", &n, &m);
     89         for (int i = 1; i <= n; ++i)
     90         {
     91             for (int j = 1; j <= n; ++j)
     92             {
     93                 cnt[i][j] = 0;
     94                 for (int d = 0; d < 4; ++d)
     95                 {
     96                     x = i + dx[d];
     97                     y = j + dy[d];
     98                     if (x >= 1 && x <= n && y >= 1 && y <= n)
     99                         ++cnt[i][j];
    100                 }
    101                 cnt[i][j] = inv[cnt[i][j]];
    102             }
    103             
    104         }
    105         for (int i = 1; i <= n; ++i)
    106             for (int j = 1; j <= n; ++j)
    107                 p[i][j] = 1;
    108         LL ans = 0;
    109         for (int i = 1; i <= n / 2; ++i)
    110             for (int j = 1; j <= n / 2; ++j)
    111                 work(i, j);
    112         for (int i = 1; i <= n; ++i)
    113             for (int j = 1; j <= n; ++j)
    114                 ans += p[i][j];
    115         ans %= mod;
    116         cout << ans << endl;
    117      }
    118     
    119     return 0; 
    120 }
  • 相关阅读:
    LeetCode15 3Sum
    LeetCode10 Regular Expression Matching
    LeetCode20 Valid Parentheses
    LeetCode21 Merge Two Sorted Lists
    LeetCode13 Roman to Integer
    LeetCode12 Integer to Roman
    LeetCode11 Container With Most Water
    LeetCode19 Remove Nth Node From End of List
    LeetCode14 Longest Common Prefix
    LeetCode9 Palindrome Number
  • 原文地址:https://www.cnblogs.com/vb4896/p/9259011.html
Copyright © 2011-2022 走看看