hdu 4599 Dice 概率DP

思路:

1.求f[n];dp[i]表示i个连续相同时的期望

则 dp[0]=1+dp[1]

    dp[1]=1+(5dp[1]+dp[2])/6

    ……

    dp[i]=1+(5dp[1]+dp[i+1])/6

    ……

    dp[n]=0

可以求得f[n]=(6^n-1)/5.

2.求h[n];dp[i]表示i个连续相同的1时的期望

则 dp[0]=1+(5dp[0]+dp[1])/6

    dp[1]=1+(5dp[0]+dp[2])/6

    ……

    dp[i]=1+(5dp[0]+dp[i+1])/6

    ……

    dp[n]=0

可以求得h[n]=(6^(n+1)-6)/5.

3.求g[m];dp[i]表示i个1时的期望

则 dp[0]=1+(5dp[0]+dp[1])/6

    dp[1]=1+(5dp[1]+dp[2])/6

    ……

    dp[i]=1+(5dp[i]+dp[i+1])/6

    ……

    dp[n]=0

可以求得g[m]=6*m.

这样就有 m1>=(6^n-1)/30;m2>=(6^n-1)/5

分析易知(6^n-1)/30不能整除,所以m1=(6^n+24)/30 ; m2=(6^n-1)/5 .

代码如下:

 

 1 #include<iostream>

 2 #include<stdio.h>

 3 #include<algorithm>

 4 #include<iomanip>

 5 #include<cmath>

 6 #include<cstring>

 7 #include<vector>

 8 #define ll __int64

 9 #define M 2011

10 using namespace std;

11 ll pows(ll a,ll b,ll mod)

12 {

13     ll ans=1;

14     while(b){

15         if(b&1) ans=ans*a%mod;

16         b>>=1;

17         a=a*a%mod;

18     }

19     return ans;

20 }

21 int main(){

22     ll n,m1,m2,p;

23     ll inv30=pows(30,M-2,M);

24     ll inv5=pows(5,M-2,M);

25     while(scanf("%I64d",&n)&&n){

26         p=pows(6,n,2011);

27         m1=((p+24)%M+M)%M*inv30%M;

28         m2=((p-1)%M+M)%M*inv5%M;

29         printf("%I64d %I64d\n",m1,m2);

30     }

31     return 0;

32 }
View Code

 

 

 

 

你可能感兴趣的:(HDU)