LightOJ

题目链接:https://vjudge.net/problem/LightOJ-1284

1284 - Lights inside 3D Grid
Time Limit: 4 second(s) Memory Limit: 32 MB

You are given a 3D grid, which has dimensions XY and Z. Each of the X x Y x Z cells contains a light. Initially all lights are off. You will have K turns. In each of the K turns,

  1. You select a cell A randomly from the grid,
  2. You select a cell B randomly from the grid and
  3. Toggle the states of all the bulbs bounded by cell A and cell B, i.e. make all the ON lights OFF and make all the OFF lights ON which are bounded by A and B. To be clear, consider cell A is (x1, y1, z1) and cell B is (x2, y2, z2). Then you have to toggle all the bulbs in grid cell (x, y, z) where min(x1, x2) ≤ x ≤ max(x1, x2)min(y1, y2) ≤ y ≤ max(y1, y2) and min(z1, z2) ≤ z ≤ max(z1, z2).

Your task is to find the expected number of lights to be ON after K turns.

Input

Input starts with an integer T (≤ 50), denoting the number of test cases.

Each case starts with a line containing four integers X, Y, Z (1 ≤ X, Y, Z ≤ 100) and K (0 ≤ K ≤ 10000).

Output

For each case, print the case number and the expected number of lights that are ON after K turns. Errors less than 10-6 will be ignored.

Sample Input

Output for Sample Input

5

1 2 3 5

1 1 1 1

1 2 3 0

2 3 4 1

2 3 4 2

Case 1: 2.9998713992

Case 2: 1

Case 3: 0

Case 4: 6.375

Case 5: 9.09765625

 

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <cmath>
 7 #include <queue>
 8 #include <stack>
 9 #include <map>
10 #include <string>
11 #include <set>
12 using namespace std;
13 typedef long long LL;
14 const int INF = 2e9;
15 const LL LNF = 9e18;
16 const int MOD = 1e9+7;
17 const int MAXN = 1e5+100;
18 
19 double Get(int pos, int n)
20 {
21     return 1.0 - 1.0*((pos-1)*(pos-1)+(n-pos)*(n-pos))/(n*n);
22 }
23 
24 double qpow(double x, int y)
25 {
26     double s = 1;
27     while(y)
28     {
29         if(y&1) s *= x;
30         x *= x;
31         y >>= 1;
32     }
33     return s;
34 }
35 
36 int main()
37 {
38     int T, x, y, z, k, kase = 0;
39     scanf("%d", &T);
40     while(T--)
41     {
42         double ans = 0;
43         scanf("%d%d%d%d", &x,&y,&z,&k);
44         for(int i = 1; i<=x; i++)
45             for(int j = 1; j<=y; j++)
46                 for(int t = 1; t<=z; t++)
47                 {
48                     double p = Get(i,x)*Get(j,y)*Get(t,z);
49                     ans += 0.5-0.5*qpow(1-2*p, k);
50                 }
51         printf("Case %d: %.10lf
", ++kase, ans);
52     }
53 }
View Code
原文地址:https://www.cnblogs.com/DOLFAMINGO/p/8447337.html