首页 > 其他分享 >洛谷 P5363 / LOJ #3114 「SDOI2019」移动金币

洛谷 P5363 / LOJ #3114 「SDOI2019」移动金币

时间:2022-12-28 10:13:42浏览次数:67  
标签:typedef 洛谷 LOJ res ll 3114 long int const

洛谷传送门

LOJ 传送门

不错的博弈 + 计数。

不难发现题中的游戏是阶梯 Nim 的变体。若设 \(a_i\) 为第 \(i\) 枚金币的位置,令 \(\forall i \in [2,m],\ b_i = a_i - a_{i-1},\ b_1 = a_1 - 1,\ b_{m+1} = n - a_m\),则每次可以做的就是选择 \(i \in [1,m],\ x \in [1,b_i]\),将 \(b_i \gets b_i - x,\ b_{i+1} \gets b_{i+1} + x\)。这就是一个 reversed 的阶梯 Nim,结论是先手必胜当且仅当从右往左所有第偶数位的 \(b_i\) 异或和 \(\ne 0\)。

考虑容斥后转化为异或和 \(=0\)。考虑 dp,\(f_{i,j}\) 表示当前考虑到第 \(i\) 位,数的和是 \(j\)。那么每次枚举当前位有 \(k\) 个数是 \(1\)(需要满足 \(2\,|\,k\) 且 \(j + k2^i \le n\)),\(f_{i+1,j+k2^i} \gets f_{i+1,j+k2^i} + f_{i,j} \times \binom{(m+1)/2}{k}\)。最后枚举和,隔板法统计答案即可。

时间复杂度 \(O(nm \log n)\)。

code
/*

p_b_p_b txdy
AThousandSuns txdy
Wu_Ren txdy
Appleblue17 txdy

*/

#include <bits/stdc++.h>
#define pb push_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 200100;
const int maxm = 20;
const int N = 200000;
const ll mod = 1000000009;

ll n, m, fac[maxn], ifac[maxn], f[maxm][maxn];

ll qpow(ll b, ll p) {
	ll res = 1;
	while (p) {
		if (p & 1) {
			res = res * b % mod;
		}
		b = b * b % mod;
		p >>= 1;
	}
	return res;
}

void init() {
	fac[0] = 1;
	for (int i = 1; i <= N; ++i) {
		fac[i] = fac[i - 1] * i % mod;
	}
	ifac[N] = qpow(fac[N], mod - 2);
	for (int i = N - 1; ~i; --i) {
		ifac[i] = ifac[i + 1] * (i + 1) % mod;
	}
}

inline ll C(ll n, ll m) {
	if (n < m || n < 0 || m < 0) {
		return 0;
	} else {
		return fac[n] * ifac[m] % mod * ifac[n - m] % mod;
	}
}

void solve() {
	scanf("%lld%lld", &n, &m);
	n -= m;
	f[0][0] = 1;
	int t = 0;
	for (int i = 0; (1 << i) <= n; ++i) {
		t = i + 1;
		for (int j = 0; j <= n; j += 2) {
			for (int k = 0; k <= (m + 1) / 2; k += 2) {
				if (j + (k << i) <= n) {
					f[i + 1][j + (k << i)] = (f[i + 1][j + (k << i)] + f[i][j] * C((m + 1) / 2, k) % mod) % mod;
				}
			}
		}
	}
	ll ans = 0;
	for (int i = 0; i <= n; ++i) {
		ans = (ans + f[t][i] * C(n - i + m / 2, m / 2) % mod) % mod;
	}
	printf("%lld\n", (C(n + m, m) - ans + mod) % mod);
}

int main() {
	init();
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,洛谷,LOJ,res,ll,3114,long,int,const
From: https://www.cnblogs.com/zltzlt-blog/p/17009493.html

相关文章

  • 洛谷 SP11414 / SPOJ COT3 Combat on a tree
    洛谷传送门SPOJ传送门考虑计算出以\(u\)为根的子树的\(\text{SG}\)值。在\(u\)子树内选择一个白点\(w\),将\(w\tou\)上的所有点删去,原树会变成森林,\(\text{S......
  • 洛谷P4146 序列终结者 题解 splay tree
    题目链接:https://www.luogu.com.cn/problem/P4146题目大意:支持:区间更新(+x)区间翻转区间查询(最大值)解题思路:几乎和AcWing2437.Splay这题一模一样。示例程序:#inc......
  • 洛谷 P5721 【入门3】循环结构
    P5721【深基4.例6】数字直角三角形1.题目描述给出 n,请输出一个直角边长度是 n 的数字直角三角形。所有数字都是 2 位组成的,如果没有 2 位则加上前导 00。2.输......
  • AcWing1134/洛谷P1144 最短路计数
    AcWing传送门洛谷传送门题目大意\(\qquad\)给一个无向图,边权都是\(1\),求出以\(1\)为源点,到各个点(\(1\simn\))的最短路数量解题思路\(\qquad\)边权都是\(1\)的图中最......
  • 洛谷P2024 [NOI2001] 食物链
    slojP2577.食物链题目大意说实话,我做对了之后都还是有点懵语文不好都这么招歧视了吗,我太难了三类动物A,B,C,A吃B,B吃C,C吃A。给出若干关系,判断第几个关系是错误的......
  • 洛谷P1196 [NOI2002] 银河英雄传说
    slojP2577.食物链题目大意一个序列初始编号为1,2,3,,,30000有2个操作:mij合并第i列和第j列,将第i列头部接到第j列尾部cIj询问i号和j号之间的数量,若......
  • Solution -「COCI 2009-2010」「洛谷 P8076」RESTORAN
    \(\mathscr{Description}\)  Link.  给定一个含\(n\)个点\(m\)条边的简单图,求一种边二染色方案,使得所有\(\deg\ge2\)的结点都邻接于两种颜色的边.  \(n......
  • AcWing341. 洛谷P1073, NOIP2009 最优贸易
    AcWing题目传送门洛谷题目传送门题目大意\(~~~~~~\)一个投机倒把的奸商想要通过城市不太健全的贸易系统坑点钱,任意城市都可以买入或者卖出水晶球,他想尽量在便宜的城市买......
  • 洛谷 P2679 [NOIP2015 提高组]子串
    \(70pts\):记\(sub_A(i)\)表示\(A\)的前\(i\)个字符构成的子串,相应地,\(sub_B(i)\)为\(B\)的前\(i\)个字符构成的子串。设\(f(i,j,k)\)表示在\(sub_A(i......
  • 洛谷P2680 运输计划(LCA + 二分 + 树上边差分)
    洛谷P2680运输计划​ 现在有一棵树,每条树边上都有正权值。接下来,有m个询问,每次询问给出两个结点,这两个结点之间有一条路径。现在你可以任选一条树边,将其边权置为0,请输......