题目:hdu6656
题意:你处于i级,必须花费a[i]元的前提下,有r[i]/s[i]的概率跳到i+1级,也有1-r[i]/s[i]的概率掉回x[i]级(x[i]<=i),有q组询问,每次有l,r问从l升到r的花费期望。
分析:需要列出方程找公式,设f(i->i+1)表示从i->i+1花费的期望,则
用sum[i]表示从1->i的花费期望
则化简得:
最后递推一下求出sum,询问即为sum[r]-sum[l]
Ac code:
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
typedef long long ll;
ll sum[maxn],r[maxn],s[maxn],a[maxn];
int x[maxn];
const ll mod=1e9+7;
ll Pow(ll a,ll b)
{
ll ans=1,base=a;
while(b)
{
if(b&1)
ans=(ans*base)%mod;
base=(base*base)%mod;
b>>=1;
}
return ans;
}
int main()
{
int t,n,q;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&q);
for(int i=1; i<=n; i++)
scanf("%lld%lld%d%lld",&r[i],&s[i],&x[i],&a[i]);
for(int i=1; i<=n; i++)
{
sum[i+1]=(s[i]*((a[i]+sum[i])%mod)%mod-(s[i]-r[i])%mod*sum[x[i]]%mod+mod)%mod;
sum[i+1]=sum[i+1]*Pow(r[i],mod-2)%mod;
}
int l,r;
while(q--)
{
scanf("%d%d",&l,&r);
ll ans=(sum[r]-sum[l]+mod)%mod;
printf("%lld\n",ans);
}
}
return 0;
}