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 }