Description
Given a normal dice (with 1, 2, 3, 4, 5, 6 on each face), we define:
F(N) to be the expected number of tosses until we have a number facing up for N consecutive times.
H(N) to be the expected number of tosses until we have the number '1' facing up for N consecutive times.
G(M) to be the expected number of tosses until we have the number '1' facing up for M times.
Given N, you are supposed to calculate the minimal M1 that G (M1) >= F (N) and the minimal M2 that G(M2)>=H(N)
F(N) to be the expected number of tosses until we have a number facing up for N consecutive times.
H(N) to be the expected number of tosses until we have the number '1' facing up for N consecutive times.
G(M) to be the expected number of tosses until we have the number '1' facing up for M times.
Given N, you are supposed to calculate the minimal M1 that G (M1) >= F (N) and the minimal M2 that G(M2)>=H(N)
Input
The input contains multiple cases.
Each case has a positive integer N in a separated line. (1<=N<=1000000000)
The input is terminated by a line containing a single 0.
Each case has a positive integer N in a separated line. (1<=N<=1000000000)
The input is terminated by a line containing a single 0.
Output
For each case, output the minimal M1 and M2 as required in a single line, separated by a single space.
Since the answer could be very large, you should output the answer mod 2011 instead.
Since the answer could be very large, you should output the answer mod 2011 instead.
Sample Input
1 2 0
Sample Output
1 12 7
期望dp
主要是推公式http://www.cnblogs.com/allh123/archive/2013/08/25/3281039.html
#include<cstdio> #include<cstring> #include<vector> #include<iostream> #include<queue> #include<algorithm> #include<cmath> #include<cstdlib> #include<string> using namespace std; const int base = 2011; const int size = 2; int n; int inv(int x) { if (x == 1) return 1; else return inv(base % x)*(base - base / x) % base; } int get(int x, int y) { int i, j; for (i = x, j = 1; y; y >>= 1) { if (y & 1) (j *= i) %= base; (i *= i) %= base; } return j; } void work(int n) { int x = get(6, n) - 1; int y = (((x+25) * inv(30) % base) + base) % base; int z = ((x * inv(5) % base) + base) % base; printf("%d %d\n", y, z); } int main() { while (scanf("%d", &n), n) work(n); }