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

 

 

 

 

posted @ 2013-08-26 09:58  _随心所欲_  阅读(765)  评论(2编辑  收藏  举报