首页 > 其他分享 >Omkar and Akmar 题解

Omkar and Akmar 题解

时间:2023-12-19 12:03:02浏览次数:30  
标签:invfac int 题解 Akmar 空格 MAXN Omkar fac mod

题意:有一个 \(n\) 个点的环,以及两个人。每个人可以向环中任意一个位置放置一个 \(A\) 或者 \(B\),但是相邻的位置不能相同,不能行动者输。问最终的局面有多少种。

一个结论是:后手必胜。

证明:最终肯定不可能出现两个连续的空格,否则一定可以在其中一个上填 \(A\) 或 \(B\)。所以最多只有一个空格,而这个空格两边填的字母一定是不一样的,否则一定可以在这填一个和它两边不一样的字母。所以如果把所有空格去掉之后,一定是 \(ABABAB\dots\)(\(k\) 个 \(AB\)) 的形式。步数一定为偶数,所以后手必胜。

问题转化成了有多少种在环上放空格的方式,使得每两个空格都不相邻。可以先断环为链,然后分类讨论,假设当前要选 \(i\) 个空格(必须满足 \(n-i\) 为偶数)。如果链的第一个位置为空格,则后面 \(n-1\) 个要选出 \(i-1\) 个空格且首尾不能选,方案数 \(C^{i-1}_{n-i-1}\)(插空法)。如果链的第一个位置不为空格,则后面 \(n-1\) 个要选出 \(i\) 个空格且首尾可以选,方案数 \(C^{i}_{n-i}\)(插空法)。注意还要乘以 \(2\times(n-i)!\),\(2\) 表示可以从 \(A\) 开始也可以从 \(B\) 开始,\((n-i)!\) 表示每个人每次选择位置的顺序。

枚举 \(i\),累计答案即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 5e6 + 10;
const int mod = 1e9 + 7;
int n,inv[MAXN],fac[MAXN],invfac[MAXN],ans;	
inline int C(int n,int m){if(n >= m && n >= 0 && m >= 0)return fac[n] * invfac[n - m] % mod * invfac[m] % mod;else return 0;}
signed main()
{
	cin >> n;
	fac[0] = inv[0] = invfac[0] = 1;
	fac[1] = inv[1] = invfac[1] = 1;
	for(int i = 2;i <= 2 * n;i++) 
	{
		fac[i] = (fac[i - 1] * i) % mod;
		inv[i] = (inv[mod % i] * (mod - mod / i)) % mod;
		invfac[i] = (invfac[i - 1] * inv[i]) % mod;
	}  
	for(int i = 0;i <= n;i++) 
		if((n - i) % 2 == 0) ans = (ans + ((2 * fac[n - i]) % mod * (C(n - i - 1,i - 1) + C(n - i,i))) % mod) % mod;
	cout << ans;
	return 0;
}
 

标签:invfac,int,题解,Akmar,空格,MAXN,Omkar,fac,mod
From: https://www.cnblogs.com/Creeperl/p/17913389.html

相关文章

  • Square-free division (easy version) 题解
    题意:给定一个长度为\(n\)的序列,求最少能将这个序列分成多少段使得任意一段中不存在两个数的积为完全平方数。一个小Trick:如果两个数乘起来为平方数,可以先将每个数的平方因子除掉,然后这两个数必然相等。于是这道题被转化为了一个区间不能有相等的值,这就很典了。设\(pos_{a_{i......
  • Animals and Puzzle 题解
    原题链接:CF713D题意:给定一个\(n\timesm\)的地图\(a\),\(a_{i}\)为\(0\)或\(1\)。有\(t\)次询问,每次询问给定一个矩形,求出这个矩形中最大的由\(1\)构成的正方形的边长是多少。首先考虑预处理出\(d_{i,j}\)表示以\((i,j)\)为左上角的最大正方形边长是多少。对于每......
  • C0392 B 【1109 B组】预处理器 题解
    题意:求有多少个长度为\(n\)的数组\(a\)满足以下条件。条件一:\(l_{i}\lea_{i}\ler_{i}\)。条件二:\(a_{i}\)模\(2\)等于\(p_{i}\)。条件三:\(s\le\suma_{i}\let\)。求答案模\(mod\)的值,\(mod\)不一定是一个质数。数据范围:\(n\le13\)。又积累到一......
  • A Simple Task 题解
    这道题比较简单,简述一下思路。考虑状压\(DP\)。设\(dp_{i,j}\)表示走到第\(i\)个点,之前走过的点的状态为\(j\)的环的数量。这里有一个细节,就是我们都钦定每个走过的第一点是整个状态中编号最小的点,这样不会重复计算。考虑如何进行转移。如果当前点的编号比走过的最小编......
  • CF1900D Small GCD 题解
    原题链接:CF1900D,题意不多赘述。首先可以将\(a\)数组排序,并且枚举中间的那个数\(a_i\)。那么答案就是\(\sum_{j=1}^{i-1}\gcd(a_j,a_i)\times(n-i)\)。重点在于求前面的\(\gcd\)。可以用欧拉反演,但是也可以不用,因为我不会。假设我们当前已经枚举到了\(a_i\),设\(f_k\)表......
  • CF1902D Robot Queries 题解
    题意:有一个二维平面直角坐标系,给定一串向某个方向移动\(1\)个单位的操作。有\(q\)个询问,对于每个询问给定\(x,y,l,r\),问如果倒着做\(l\)到\(r\)这段区间中的操作,是否会经过\((x,y)\)。ds题。先预处理出\(sx_i,sy_i\)表示执行完操作\(i\)后的位置,如果在\([l,r]\)......
  • 华中师范大学2023新生赛 H 龙 题解
    Link华中师范大学2023新生赛H龙Question有\(m\)个宝石孔,有\(n\)个宝石,每个宝石可以提升\(a_i\)点战斗力每次镶嵌一个宝石,被选中的宝石会随机选择一个宝石孔进去,如果这个孔原来有宝石,则原来的宝石会被损坏你可以任意决定镶嵌宝石的顺序,她想知道,如果把着\(n\)颗宝......
  • 华中师范大学2023新生赛 D 身无彩凤双飞翼 题解
    Link华中师范大学2023新生赛D身无彩凤双飞翼Question给出一个\(n\timesm\)的网格,网格上有一些障碍,问最少添加多少障碍才能使\((1,1)\)和\((n,m)\)不连通Solution我好像用了一种和标答不一样的写法我们先对图bfs一次,如果\((1,1)\)不能到达\((n,m)\),则图本来就......
  • CF1905 B Begginer's Zelda 题解
    LinkCF1905BBegginer'sZeldaQuestion给出一棵树,每次能把一条路径压缩成一个点,求最少几次把树压缩成一个点Solution贪心的想,路径肯定越长越好,所以肯定是以一个儿子节点为起点,以一个儿子节点为终点,儿子节点合并了儿子到根的父节点也合并了,每次合并两个儿子节点,假设儿子节点......
  • 【题解】CodeForces-1913
    CodeForces-1913ARatingIncrease依题意模拟。提交记录:Submission-CodeForcesCodeForces-1913BSwapandDelete交换免费就是能任意重排,从头开始尽量填相反的,剩下只能删去了。提交记录:Submission-CodeForcesCodeForces-1913CGamewithMultiset从大到小能减则减一定......