题目链接: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 X, Y 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,
- You select a cell A randomly from the grid,
- You select a cell B randomly from the grid and
- 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 }