首页 > 其他分享 >CF1628D1 Game on Sum (Easy Version) 题解

CF1628D1 Game on Sum (Easy Version) 题解

时间:2024-03-23 22:57:16浏览次数:16  
标签:CF1628D1 题解 Sum long times ans define ll jc

题目传送门 (Easy Version) | 题目传送门 (Hard Version)

前置知识

博弈论

解法

CF1628D1 Game on Sum (Easy Version)

设 \(x_{i}\) 表示第 \(i\) 轮时 Alice 选择的数。

设 \(f_{i,j}\) 表示已经进行了 \(i\) 轮,且使用了 \(j\) 次加法时的最大得分,状态转移方程为 \(f_{i,j}= \max \{ \min(f_{i-1,j}-x_{i},f_{i-1,j-1}+x_{i}) \}=\frac{f_{i-1,j}+f_{i-1,j-1}}{2}\),边界为 \(\begin{cases} f_{i,0 \sim \infty}=0 & i=0 \\ f_{i,0}=0, f_{i,i}=i \times k & i \ne 0 \end{cases}\)。

  • 由于 Bob 想让结果尽可能小,所以有 \(f_{i,j}= \min(f_{i-1,j}-x_{i},f_{i-1,j-1}+x_{i})\)。
  • 由于 Alice 想让结果尽可能大,所以会让 \(\min(f_{i-1,j}-x_{i},f_{i-1,j-1}+x_{i})\) 取到最大值,即 \(f_{i-1,j}-x_{i}=f_{i-1,j-1}+x_{i}\) 时,解得 \(x_{i}= \frac{f_{i-1,j}-f_{i-1,j-1}}{2}\),代入原式有 \(f_{i,j}=\frac{f_{i-1,j}+f_{i-1,j-1}}{2}\)。

由于 Bob 想让结果尽可能小,所以至多使用 \(m\) 次加法,故最终 \(f_{n,m}\) 即为所求。

另外,由于求解 \(f_{n,m}\) 的过程中只有加法和 \(\times \frac{1}{2}\) 运算,故可以将 \(k\) 缩小至 \(1\) 进行预处理 \(f_{n,m}\),询问时再扩大到 \(k\),即 \(f_{n,m} \times k\)。

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
const ll p=1000000007;
ll f[2010][2010];
ll qpow(ll a,ll b,ll p)
{
    ll ans=1;
    while(b>0)
    {
        if(b&1)
        {
            ans=ans*a%p;
        }
        b>>=1;
        a=a*a%p;
    }
    return ans;
}
int main()
{
    ll t,n,m,k,i,j;
    cin>>t;
    for(i=1;i<=2000;i++)
    {
        f[i][0]=0;
        f[i][i]=i;
        for(j=1;j<=i-1;j++)
        {
            f[i][j]=((f[i-1][j]+f[i-1][j-1])%p)*qpow(2,p-2,p)%p;
        }
    }
    for(i=1;i<=t;i++)
    {
        cin>>n>>m>>k;
        cout<<f[n][m]*k%p<<endl;
    }
    return 0;
}

CF1628D2 Game on Sum (Hard Version)

观察到 \(f\) 的转移过程比较像杨辉三角的转移过程。

当 \(n=m\) 时,有 \(f_{n,m}=m \times k\) 即为所求。

当 \(n \ne m\) 时,

  • 考虑计算 \(f_{i,i}\) 对 \(f_{n,m}\) 产生的贡献。
    • 从 \(f_{i,i}\) 到 \(f_{n,m}\) 一共进行了 \(n-i\) 次 \(\times \frac{1}{2}\) 操作。
    • 由 \(f_{i,j}\) 会向 \(f_{i+1,j}\) 和 \(f_{i+1,j+1}\) 进行转移,故等价于 \((i,j)\) 一次可以走到 \((i+1,j)\) 或 \((i+1,j+1)\),求不经过形如 \((x,x)\) 的点时从 \((i,i)\) 走到 \((n,m)\) 的方案数,即从 \((i+1,i)\) 走到 \((n,m)\) 的方案数 \(\dbinom{n-(i+1)}{m-i}\)。
  • 故 \(\sum\limits_{i=1}^{m}\frac{i \times k \times \binom{n-(i+1)}{m-i}}{2^{n-i}}\) 即为所求。
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
const ll p=1000000007;
ll jc[2000010],inv[2000010],jc_inv[2000010],a[2000010];
ll qpow(ll a,ll b,ll p)
{
    ll ans=1;
    while(b>0)
    {
        if(b&1)
        {
            ans=ans*a%p;
        }
        b>>=1;
        a=a*a%p;
    }
    return ans;
}
ll C(ll n,ll m,ll p)
{
    return (n>=m&&n>=0&&m>=0)?(jc[n]*jc_inv[m]%p)*jc_inv[n-m]%p:0;
}
int main()
{
    ll t,n,m,k,ans=0,i,j;
    cin>>t;
    jc[0]=jc_inv[0]=1;
    for(i=1;i<=1000000;i++)
    {
        a[i]=i;
        jc[i]=jc[i-1]*a[i]%p;
    }
    for(i=1000001;i<=2000000;i++)
    {
        a[i]=qpow(2,i-1000000-1,p);
        jc[i]=jc[i-1]*a[i]%p;
    }
    jc_inv[2000000]=qpow(jc[2000000],p-2,p);
    for(i=2000000-1;i>=1;i--)
    {
        jc_inv[i]=jc_inv[i+1]*a[i+1]%p;
    }
    for(i=1;i<=2000000;i++)
    {
        inv[i]=jc_inv[i]*jc[i-1]%p;
    }
    for(i=1;i<=t;i++)
    {
        cin>>n>>m>>k;
        ans=0;
        if(n==m)
        {
            cout<<m*k%p<<endl;
        }
        else
        {
            for(j=1;j<=m;j++)
            {
                ans=(ans+((j*k%p)*C(n-(j+1),m-j,p)%p)*inv[1000000+1+n-j]%p)%p;
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}

标签:CF1628D1,题解,Sum,long,times,ans,define,ll,jc
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18091843

相关文章

  • codeforces div_2 936 题解报告
    codeforcesdiv_2936题解报告比赛链接:https://codeforces.com/contest/1946A.MedianofanArray做法tag:签到题目翻译给定一个长度为\(n\)的数组\(a\),记数组中非降序排列中第\({\lceil\fracn2\rceil}\)个数是数组a的中位数。我们可以以下操作。选择一个数\(i\in[......
  • CF494C Helping People 题解
    题目传送门前置知识概率DP|树形DP|RMQ解法观察到区间只有相离或包含关系,类似线段树的管辖区间,考虑将其构成树形关系。为方便代码书写,将原来的森林构成一棵树,即增加一个区间\(l_{q+1}=1,r_{q+1}=n,p_{q+1}=0\)。由于对于一个区间\([l,r]\)的最大值在经历任意次操作后,......
  • CF922E Birds 题解
    题目传送门前置知识背包DP解法观察到\(w\)极大,若使用正常的背包空间会爆炸。依据AT_dp_eKnapsack2的经验,考虑将背包“反”着用。设\(f_{i,j}\)表示到第\(i\)棵树时一共召唤了\(j\)只小鸟时剩余的最大魔力值,状态转移方程为\(f_{i,j}=\min(\max\limits_{k=0}^{\m......
  • [暴力题解系列] 2023年蓝桥杯-冶炼金属
    世界上存在很难的题,但不存在暴力偷不到分的题​ 这题的暴力思路比你想的更简单,我直接枚举v的数值不就行了?#include<iostream>#include<algorithm>usingnamespacestd;inta[10010],b[10010];intmain(){intn;scanf("%d",&n);for(inti=1;i<=n;i++)......
  • P10268 符卡对决 题解
    题目链接:符卡对决视频讲解待上传经典的题目,对于这个\([l,r]\)询问,我们先关注期望怎么算。考虑方案总数和有效的和,方案总数显然有\(\dfrac{n\times(n-1)}{2}\),现在还需要关注有效和,我们关注对于若干个有效的关系用一个比较形象的数据结构表示-----并查集,那么两个卡牌之间有......
  • CF1711B Party 题解
    CF1711BParty原题题意给定$n$个点带点权的无向图,点权$a_i$保证无重边自环,点权非负),要求删去一些点和它相连的边,使得剩下这个图的边数为偶数且删去点的点权之和最小。问删去点的点权之和最小是多少?分类讨论我们分类讨论一下。$m$为偶数,则不需要删边或点,直接输出$0$即......
  • 洛谷P3498 [POI2010] KOR-Beads 题解
    P3498[POI2010]KOR-Beads对于数列${A_i}$,求$k$使数列被分为$\lfloor\frac{n}{k}\rfloor$个部分后不同子数列种类最多(子串翻转前后为一类子串)很容易想到:枚举$k\\in\[1,n]$,记录每个$k$下不同种类数,然后取最优即可,那么问题来了:如何计算种类数?暴戾算法:一种纯......
  • 跳马【华为OD机试JAVA&Python&C++&JS题解】
    一.题目马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或直着走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称“马走‘日’字。给顶m行n列的棋盘(网格图),棋盘上只有有棋子象棋中的棋子“马”,并且每个棋子有等级之分,等级为k的马可以跳1~k......
  • Maximum Sum(Round 936)
    #include<bits/stdc++.h>#defineendl'\n'usingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();constllmod=1e9+7;llmaxSum(vector<ll>a,intw){llsum=0;llb=0;for(inti......
  • CF710D Two Arithmetic Progressions 题解
    CF710DTwoArithmeticProgressions根号分治薄纱数论看日报学习的根号分治:暴力美学——浅谈根号分治-paulzrm的博客。开始想学ODT的映射思想的推广-金珂拉的博客,结果先学了ODT,又学了根号分治,才搞懂前置知识。什么是根号分治根号分治,是暴力美学的集大成体现。与......