2018.11.03-dtoj-3130-流浪者(rover)
生活随笔
收集整理的這篇文章主要介紹了
2018.11.03-dtoj-3130-流浪者(rover)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目描述:
有一位流浪者正在一個n*m的網(wǎng)格圖上流浪。初始時流浪者擁有S點體力值。
流浪者會從(1,1)走向(n,m),并且他只會向下走((x,y)→(x+1,y))或是往右走((x,y)→(x,y+1)),在所有可行的路線中他會隨機選擇一條。
網(wǎng)絡(luò)圖中還有K個障礙點。若流浪者當前體力值為S,則他經(jīng)過一個障礙點后體力值會變?yōu)?S/2?(上取整)。現(xiàn)
在請你求出,流浪者到達(n,m)時他體力值的期望是多少。
若答案為ab,則你輸出ab在模109+7意義下的值即可。
輸入:
第一行四個整數(shù)n,m,K,S, 意義見題目描述。
接下來K行每行兩個整數(shù)Xi,Yi,表示一個障礙點,保證一個障礙點不會出現(xiàn)多次。起點與終點可能也會是障礙點。
輸出:
僅一行一個整數(shù)表示答案。
數(shù)據(jù)范圍:
30%的數(shù)據(jù):n,m≤10
50%的數(shù)據(jù):n,m≤1000
1000%的數(shù)據(jù):1≤n,m≤105,0≤K≤min(n*m,2000),1≤S≤106
算法標簽:期望DP
式子題,公式太難打了,僅附代碼
以下代碼:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define il inline #define LL long long #define _(d) while(d(isdigit(ch=getchar()))) using namespace std; const int N=1e5+5,p=1e9+7; LL jc[N<<1],ny[N<<1],ans; struct node{int x,y;}pi[2005]; int n,m,k,tmp,num,s,f[2005][25]; il int read(){int x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch^48;_()x=(x<<1)+(x<<3)+(ch^48);return f*x;} bool cmp(node t1,node t2){return (t1.x<t2.x||(t1.x==t2.x)&&t1.y<t2.y);} il LL ksm(LL a,int y){LL b=1;while(y){if(y&1)b=b*a%p;a=a*a%p;y>>=1;}return b;} il LL C(int n,int m){return jc[n]*ny[m]%p*ny[n-m]%p;} il LL way(int i,int j){int x=pi[j].x-pi[i].x,y=pi[j].y-pi[i].y;return C(x+y,x); } int main() {n=read();m=read();k=read();tmp=read();s=tmp;for(int i=1;i<=k;i++)pi[i].x=read(),pi[i].y=read();sort(pi+1,pi+1+k,cmp);pi[++k].x=n;pi[k].y=m;int kk=n+m;jc[0]=1;for(int i=1;i<=kk;i++)jc[i]=jc[i-1]*(LL)i%p;ny[kk]=ksm(jc[kk],p-2);for(int i=kk;i;i--)ny[i-1]=ny[i]*(LL)i%p;num=0;/*tmp=(tmp+1)>>1;*/while(tmp>1){num++;tmp=(tmp+1)>>1;}for(int i=1;i<=k;i++){for(int j=0;j<=num;j++){f[i][j]=C(pi[i].x+pi[i].y-2,pi[i].x-1);for(int kk=1;kk<i;kk++){if(pi[kk].y>pi[i].y)continue;f[i][j]=((f[i][j]-f[kk][j]*way(kk,i)%p)%p+p)%p;}for(int kk=1;kk<j;kk++){f[i][j]=((f[i][j]-f[i][kk])%p+p)%p;}} // f[i][num]=C(pi[i].x+pi[i].y-2,pi[i].x-1); // for(int j=num;j>=1;j--)f[i][j]=((f[i][j]-f[i][j-1])%p+p)%p;printf("%d ",s); }for(int i=1;i<=num;i++){ans=(ans+(LL)s*f[k][i]%p)%p;s=(s+1)>>1;}LL sum=C(n+m-2,n-1);for(int i=1;i<=num;i++)sum=(sum-f[k][i]+p)%p;ans=(ans+sum)%p;ans=ans*ksm(C(n+m-2,n-1),p-2)%p;printf("%lld\n",ans);return 0; } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/Jessie-/p/9901359.html
總結(jié)
以上是生活随笔為你收集整理的2018.11.03-dtoj-3130-流浪者(rover)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DevOps简单介绍
- 下一篇: 硬盘盘符无法识别或已损坏,别急着格式化