HDU 4599 Dice

来源:互联网 发布:淘宝购物返利那个高 编辑:程序博客网 时间:2024/04/30 04:47

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)
 

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.
 

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.
 

Sample Input

120
 

Sample Output

1 1

2 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);}


0 0
原创粉丝点击