Kejinプレーヤー(HDU-6656)

問題の説明

乗器QQは常にゲーム内のより高いレベルを取得するために人民元の多くを支払うそれらKejin選手を、envies。そこで彼は、あなたが今このゲームのゲームデザイナーであることを懸命に働きました。彼は、これらのKejin選手を少し困ら、人民元は常に仕事しないことを彼らに教訓を与えることにしました。

このゲームは、「レベルI + 1を取得するために人民元あなたは私のレベルであれば、あなたが支払わなければならない愛」の伝統的なKejinルールに従います。乗器QQは今それを少し変更:「あなたはレベルIのとき、あなたは確率PIでレベルI + 1に取得され、AI元を支払う、そうでない場合、あなたはレベルのXI(xi≤i)に変わります」。

乗器QQはまだ、彼らはレベルrにレベルLからアップグレードできるようにすることを「`` KE」にKejinプレーヤーのニーズを予想どのくらいのお金を知っている必要があり、これが高すぎる場合は、心配するので、これらのプレーヤーは、ちょうど終了し、決して再び返すことがあります。

入力

入力の最初の行は、テストケースの数を表す、整数tです。

各テストケースのために、レベルの合計数とクエリの数を意味する最初の行に2つのスペースで区切られた整数N(1≤n≤500000)およびQ(1≤q≤500000)が、存在します。

その後、次のn行、各含有整数とri、SI、XI、(1≤ri≤si≤109、1≤xi≤i、0≤ai≤109)AI、空間を分離しました。PIはフラクションRISIの形で与えられることに留意されたいです。

次のQラインはq個のクエリです。これらのクエリの各々は、二つのスペースで区切られた整数lおよびR(1≤l<r≤n+ 1)です。

すべてのTテストケースの両方しないからのnおよびqの和の合計が106を超えます。

出力

各クエリのために、ある割合のフォームモジュロ109 + 7、中出力答え、答えはPQであれば、あなたはQ-1は、Qモジュロの逆数を表す出力P⋅Q-1モジュロ109 + 7は、すべき109+ 7。

サンプル入力

1
3 2
1 1 1 2
1 2 1 3
1 3 3 4
1 4
3 4

サンプル出力

22
12

問題の意味:Tデータセットとデータの各集合N所定のクエリーQは、データのセットごとに、R [i]は、S [i]は、X [i]は、[i]は代表からの4つの数は、ありますL与えられたi番目+ 1上昇[i]がかかり、レベルIの段階、成功の確率はRである[I] / P [i]は、それがクエリのセットごとに、[I] Xをダウングレードに失敗した場合、 [i]は、R [i]は、Lからクエリ[i]のレベルは、[i]は、所望のレベルのRローズ

アイデア:

LからRに設けられたE(L、R)は、1リットルのアップグレードので、所望のアップグレード1からRへのアップグレード、したがってlで結合し、次いで、満足:E(L、R)= E( 1、R)-E(1、L)

したがって、立ち上がりRレベルI 1から所望のレベルの上昇を表す[I] DPと所望の寸法の縮小にLからDP [L] [R]で表すことができ、従って、E(L、R)= DP [R ] -dp [L]

DPから転送された[I] Tで成功したと仮定すると、[I + 1] DPために、T-1、前の小計が障害である、従って、現在のコスト+コスト+失敗の次の状態を取ることに成功取りフロントに失敗バック+ X [i]は後の状態をとります

即有:DP [I + 1] = DP [I] + [I] +(T-1)* [I] +(T-1)*(DP [I] -dp [X [I] )

次いで、T成功、失敗した最初のT-1、総時間tによって理解されるように、T-1失敗が存在する、すなわち:(T-1)/ T = 1-R [I] /秒[i]は、T = S [I] / R [i]が存在します

DP [I + 1] = DP [I] + S [I] / R [I] * [I] +(S [I] / R [I] -1)*(:したがって、状態遷移式でありますDP [I] -dp [X [I]])

ソースプログラム

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<unordered_map>
#include<bitset>
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
#define Pair pair<int,int>
LL quickPow(LL a,LL b){ LL res=1; while(b){if(b&1)res*=a; a*=a; b>>=1;} return res; }
LL multMod(LL a,LL b,LL mod){ a%=mod; b%=mod; LL res=0; while(b){if(b&1)res=(res+a)%mod; a=(a<<=1)%mod; b>>=1; } return res%mod;}
LL quickMultPowMod(LL a, LL b,LL mod){ LL res=1,k=a; while(b){if((b&1))res=multMod(res,k,mod)%mod; k=multMod(k,k,mod)%mod; b>>=1;} return res%mod;}
LL quickPowMod(LL a,LL b,LL mod){ LL res=1; while(b){if(b&1)res=(a*res)%mod; a=(a*a)%mod; b>>=1; } return res; }
LL getInv(LL a,LL mod){ return quickPowMod(a,mod-2,mod); }
LL GCD(LL x,LL y){ return !y?x:GCD(y,x%y); }
LL LCM(LL x,LL y){ return x/GCD(x,y)*y; }
const double EPS = 1E-10;
const int MOD = 1000000000+7;
const int N = 500000+5;
const int dx[] = {-1,1,0,0,1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;

LL r[N], s[N], x[N], a[N];
LL dp[N];
int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        int n, q;
        scanf("%d%d", &n, &q);

        for (int i = 1; i <= n; i++) {
            scanf("%lld%lld%lld%lld", &r[i], &s[i], &x[i], &a[i]);
            LL inv = getInv(r[i], MOD);
            LL t = (s[i] % MOD * inv % MOD) % MOD;
            LL temp1 = dp[i] % MOD; //前一状态
            LL temp2 = (t % MOD * a[i] % MOD) % MOD; //成功花费与失败花费的和
            LL temp3 = ((t - 1 + MOD) % MOD * (dp[i] - dp[x[i]] + MOD) % MOD) % MOD; //失败后回到x[i]状态的花费
            dp[i + 1] = (temp1 + temp2 + temp3 + MOD) % MOD;
        }

        for (int i = 1; i <= q; i++) {
            int left, right;
            scanf("%d%d", &left, &right);
            LL res = (dp[right] - dp[left] + MOD) % MOD;
            printf("%lld\n", res);
        }
    }
    return 0;
}

 

发布了1871 篇原创文章 · 获赞 702 · 访问量 194万+

おすすめ

転載: blog.csdn.net/u011815404/article/details/102748890