【CF1628D2】Game on Sum (DP)
undefined
- A 和 B 会进行 轮游戏,初始计数器 。
- 每轮 A 会先选择一个数 ,然后 B 选择给 减去 或加上 ,且总共至少需要选择 次给 加上 。
- A 想要最大化 ,B 想要最小化 ,求两人都选择最优策略时最终的 。
暴力动态规划
设 表示局面 的答案。
假设 A 第一步选择了数 ,则 B 有两种选择:减 ,进入局面 ;加 ,进入局面 。
即 ,那么肯定取 。
注意,当 的时候,B 只能一直选择加 ,即 。
优化
给 两边同时乘以 ,得到:
所以设 ,就有:
这个转移和组合数完全相同。
而我们需要特殊考虑的只有 的 种情况,只要枚举第一次选择向右而不向右上方走的位置 ,给 (即 )乘上 走到 的方案数(即 )转移即可。
代码:
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Rg register
#define RI Rg int
#define Cn const
#define CI Cn int&
#define I inline
#define W while
#define N 1000000
#define X 1000000007
#define C(x,y) (1LL*Fc[x]*Ic[y]%X*Ic[(x)-(y)]%X)
using namespace std;
int n,m,k,Fc[N+5],Ic[N+5];
I int QP(RI x,RI y) {RI t=1;W(y) y&1&&(t=1LL*t*x%X),x=1LL*x*x%X,y>>=1;return t;}
int main()
{
RI i;for(Fc[0]=i=1;i<=N;++i) Fc[i]=1LL*Fc[i-1]*i%X;for(Ic[i=N]=QP(Fc[N],X-2);i;--i) Ic[i-1]=1LL*Ic[i]*i%X;
RI Tt,p,t;scanf("%d",&Tt);W(Tt--)
{
if(scanf("%d%d%d",&n,&m,&k),n==m) {printf("%d\n",(int)(1LL*n*k%X));continue;}//特判n=m
for(p=1,t=i=0;i<=min(i,m);p=2*p%X,++i) t=(t+1LL*p*i%X*k%X*C(n-i-1,m-i))%X;//枚举第一个向右走的位置
printf("%d\n",(int)(1LL*t*QP(2,X-1-n)%X));//除以2^n
}return 0;
}
待到再迷茫时回头望,所有脚印会发出光芒
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-03-03 【YbtOJ751】「分治」序列异或(倍增)
2019-03-03 【BZOJ4555】[TJOI2016&HEOI2016] 求和(NTT)
2019-03-03 【BZOJ1453】[WC] Dface双面棋盘(LCT维护联通块个数)
2019-03-03 【BZOJ4025】二分图(LCT动态维护图连通性)