HDU 4599 Dice(概率dp)
2016-06-29 21:52
337 查看
F(n)表示连续扔出1个数字朝上n次的期望
H(n)表示连续扔出1朝上n次的期望
G(n)表示扔出n次1朝上的期望
怎么推导这几个公式呢。
考虑dp[i]表示已经扔了i次某个数字朝上的还需要多少次才能完成的期望
转移是dp[i]=16(1+dp[i+1])+56(1+dp[1]),dp[n]=0,dp[0]=1+dp[1]
因为要么变为连续i+1次朝上,要么扔出其他的面,则变成dp[1]
如何来求dp[1]呢,我们可以使用待定系数法,观察到每个dp[i]里面都有dp[1]
设dp[i]=A[i]dp[1]+B[i]dp[i]=16(1+A[i+1]dp[1]+B[i+1])+56(1+dp[1])dp[i]=(16A[i+1]+56)dp[1]+1+16B[i+1]所以可以得到A[i]=16A[i+1]+56B[i]=1+16B[i+1]并且得到dp[1]=A[1]dp[1]+B[1]dp[1]=B[1]1−A[1]dp[0]=dp[1]+1这样就可以求出dp[0]了,最后得到结果F(n)=6n−15并且猜想H(n)=6F(n)因为F是可以任意数字连续n次,H是必须是1,概率是原来的六分之一,所以期望是6倍G(n)=6n这个必然是的,6次中有1次是1,所以6n次可以得到n次1
然后就是求答案咯,第一个解是6n≥6n−15n≥6n−130然而这里需要考虑到6n−1并不能整除30,6n%30=6,所以n是一个整数,应该为n≥6n+2430≥6n−130然后求逆元即可。
第二个值为6n≥6(6n−1)5n≥6n−156n−1可以整除5,所以后面这个值就是个整数,可以直接求逆元
代码
H(n)表示连续扔出1朝上n次的期望
G(n)表示扔出n次1朝上的期望
怎么推导这几个公式呢。
考虑dp[i]表示已经扔了i次某个数字朝上的还需要多少次才能完成的期望
转移是dp[i]=16(1+dp[i+1])+56(1+dp[1]),dp[n]=0,dp[0]=1+dp[1]
因为要么变为连续i+1次朝上,要么扔出其他的面,则变成dp[1]
如何来求dp[1]呢,我们可以使用待定系数法,观察到每个dp[i]里面都有dp[1]
设dp[i]=A[i]dp[1]+B[i]dp[i]=16(1+A[i+1]dp[1]+B[i+1])+56(1+dp[1])dp[i]=(16A[i+1]+56)dp[1]+1+16B[i+1]所以可以得到A[i]=16A[i+1]+56B[i]=1+16B[i+1]并且得到dp[1]=A[1]dp[1]+B[1]dp[1]=B[1]1−A[1]dp[0]=dp[1]+1这样就可以求出dp[0]了,最后得到结果F(n)=6n−15并且猜想H(n)=6F(n)因为F是可以任意数字连续n次,H是必须是1,概率是原来的六分之一,所以期望是6倍G(n)=6n这个必然是的,6次中有1次是1,所以6n次可以得到n次1
然后就是求答案咯,第一个解是6n≥6n−15n≥6n−130然而这里需要考虑到6n−1并不能整除30,6n%30=6,所以n是一个整数,应该为n≥6n+2430≥6n−130然后求逆元即可。
第二个值为6n≥6(6n−1)5n≥6n−156n−1可以整除5,所以后面这个值就是个整数,可以直接求逆元
代码
#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <string> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <sstream> #include <cstdlib> #include <iostream> #include <algorithm> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; #define MAX 100005 #define MAXN 6005 #define maxnode 15 #define sigma_size 30 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define lrt rt<<1 #define rrt rt<<1|1 #define middle int m=(r+l)>>1 #define LL long long #define ull unsigned long long #define mem(x,v) memset(x,v,sizeof(x)) #define lowbit(x) (x&-x) #define pii pair<int,int> #define bits(a) __builtin_popcount(a) #define mk make_pair #define limit 10000 //const int prime = 999983; const int INF = 0x3f3f3f3f; const LL INFF = 0x3f3f; const double pi = acos(-1.0); //const double inf = 1e18; const double eps = 1e-8; //const LL mod = 1e9+7; const ull mx = 133333331; /*****************************************************/ inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; } /*****************************************************/ const int mod = 2011; int qpow(int a,int n){ int ans=1; while(n){ if(n&1) ans=ans*a%mod; a=a*a%mod; n>>=1; } return ans; } int main(){ int n; while(cin>>n&&n){ cout<<(((qpow(6,n)+24)%mod+mod)*qpow(5,mod-2)%mod)*qpow(6,mod-2)%mod<<" "; cout<<((qpow(6,n)-1)%mod+mod)*qpow(5,mod-2)%mod<<endl; } return 0; }
相关文章推荐
- OpenCV 3 on Mac with Xcode 6.2
- 带隙基准(Bandgap,BG)
- 漫谈MySql中的事务
- Android 之 IPC 进程通信全解析 -- 墙裂推荐
- Maven安装和简单入门(1)
- ACM学期总结
- linux c++消息队列(ftok,msgget,msgsnd,msgrcv,msgctl)
- Problem-I
- LVM逻辑管理器(Logical volume Manager)
- JavaScript -- switch,case,break,default
- 浏览器兼容性问题大汇总
- Mybatis 传入多个参数的方法
- Problem J
- 奋斗的路上
- Java高级之线程同步
- Java高级之线程同步
- 程序员面试(c++)——面向对象
- ASCII码表完整版
- 非root用户正常使用wireshark方法
- 使用WPF创建SignalR服务端