CF1628D2 Game on Sum
Part1
神奇的博弈类型
我们发现与当前状态有关的量,有且只有 现在是第几轮,还有 Bob 用了几次加的操作 ,这都会影响之后的决策,而和之前的决策无关,换句话说,当前决策有后效性,没有前效性。那我们考虑倒着
Part2
设
初始状态
直接暴力转移,复杂度
Part3
考虑优化,发现对答案相当于每个
想象一个平面直角坐标系的第一象限,
每次走必定向右走一格,所以一共可以走
答案即为:
复杂度
Code
#include <iostream>
#include <cstdio>
#define int long long
const int N=1e6+10;
const int mod=1e9+7;
using namespace std;
inline int read() {
int f=1, x=0;
char ch=getchar();
while(ch>'9' || ch<'0') {
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9') {
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return f*x;
}
inline void write(int x) {
cout<<x; putchar('\n');
}
int T, n, m, k;
int fac[N], inv[N], invj[N], power[N];
void prework() {
fac[0]=fac[1]=inv[0]=inv[1]=invj[0]=invj[1]=1;
for(int i=2;i<=N-5;i++) {
fac[i]=fac[i-1]*i%mod;
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
invj[i]=invj[i-1]*inv[i]%mod;
}
power[0]=1;
for(int i=1;i<=N-5;i++) power[i]=power[i-1]*inv[2]%mod;
}
inline int C(int n,int m) {
if(m>n) return 0;
return fac[n]*invj[m]%mod*invj[n-m]%mod;
}
signed main() {
prework();
T=read();
while(T--) {
n=read(), m=read() ,k=read();
if(n==m) {
write(m*k%mod);
continue;
}
int ans=0;
for(int i=1;i<=m;i++) {
int sum=i*C(n-i-1,m-i)%mod*power[n-i]%mod;
ans=(ans+sum)%mod;
}
write(ans*k%mod);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话