首页 > 其他分享 >题解 LGP9018【[USACO23JAN] Moo Route G】

题解 LGP9018【[USACO23JAN] Moo Route G】

时间:2023-02-11 23:46:10浏览次数:45  
标签:ifac int 题解 Route USACO23JAN 回路 Bessie include LL

problem

现在有一条数轴,\(t\) 表示当前时刻。在 \(t=0\) 时 Bessie 恰好处在 \(x=0\) 的位置。

接下来,每秒钟 Bessie 会向左或者向右移动一个单位距离,我们保证 Bessie 是在 \(0-N\) 的位置之间移动并最终停在 \(x=0\) 的位置。同时,我们有一个 \(A_0,A_1,A_2\ldots A_{N-1}\) 的数列,分别表示 Bessie 经过 \(0.5,1.5,2.5\ldots (N-1).5\) 这些点的次数。我们可以用一个由 \(\text{L}\) 和 \(\text{R}\) 组成的序列来表示 Bessie 的路径,我们称 Bessie 改变了一次方向为在序列中的相邻两个字符不同。现在我们不知道具体的移动序列是什么,但我们知道 Bessie 采用了让她改变方向次数最少的走法。现在请问 Bessie 的路径有多少种不同的可能情况?(我们称两条路径不同当且仅当这条路径对应序列中的某一位不同)

对 \(10^9+7\) 取模,\(N\le10^5,\max(A_i)\le10^6\)。

明显 \(a_i\) 全为偶数,所以我们将其除以二。

solution

假如求出前 \((i-1)\) 个的答案,现在有 \(a_{i-1}\) 个回路的一端在 \((i-1)\) 处,考虑接到 \(a_i\) 上。

因为 Bessie 采用了让她改变方向次数最少的走法,我们要尽量的让 Bessie 转弯次数尽可能的少。
一个显然的贪心是将尽量多的 \(a_i\) 接到 \(a_{i-1}\) 上,使每一个 \(a_{i-1}\) 的回路都接到 \(i\) 处。

如果 \(a_{i-1}\geq a_i\),发现接不完,但还是要接,给每一个 \(a_i\) 安排一个 \((i-1)\) 的回路。
因为回路之间是没有区别的,所以方案数为:\(\binom{a_{i-1}}{a_i}\)。

如果 \(a_{i-1}<a_i\),发现接完了还有剩的。考虑为了贪心,我们先给每一个 \((i-1)\) 的回路安排一个。
此时剩下 \(a_i-a_{i-1}\) 个回路,随便放在 \((i-1)\),发现是一个经典插板法。
仔细考虑发现不需要插板:考虑第一个 \((i-1)\) 的回路一定是要了 \((i)\) 的一个回路;如果确定了其余每一个 \((i-1)\) 回路接上哪一个回路,那么我们断言:两个匹配的 \((i)\) 之间直接放进去就可以了。
同样可以推出结论为:\(\binom{a_i-1}{a_{i-1}-1}\)。

code

点击查看代码
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr,##__VA_ARGS__)
#else
#define debug(...) void(0)
#endif
typedef long long LL;
const int P=1e9+7;
LL mod(LL x){return (x%P+P)%P;}
void red(LL&x){x=mod(x);}
LL qpow(LL a,LL b,int p){LL r=1;for(a%=p;b;b>>=1,a=a*a%p) if(b&1) r=r*a%p; return r;}
template<int N,int P> struct C_prime{
	LL fac[N+10],ifac[N+10];
	C_prime(){
		for(int i=fac[0]=ifac[0]=1;i<=N;i++) fac[i]=fac[i-1]*i%P;
		ifac[N]=qpow(fac[N],P-2,P);
		for(int i=N-1;i>=1;i--) ifac[i]=ifac[i+1]*(i+1)%P;
	}
	LL operator()(int n,int m){return fac[n]*ifac[n-m]%P*ifac[m]%P;}
};
int n,a[100010];
LL res=1;
C_prime<1000010,P> C;
int main(){
//	#ifdef LOCAL
//	 	freopen("input.in","r",stdin);
//	#endif
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i]>>=1;
	for(int i=2;i<=n;i++){
		if(a[i-1]>=a[i]) red(res*=C(a[i-1],a[i]));
		else red(res*=C(a[i]-1,a[i-1]-1));
	}
	printf("%lld\n",res);
	return 0;
}

标签:ifac,int,题解,Route,USACO23JAN,回路,Bessie,include,LL
From: https://www.cnblogs.com/caijianhong/p/solution-p9018.html

相关文章

  • flannel 低版本glog flag redefined error 问题解决
    最近在构建一个老版本的flannel的时候碰到了此问题,记录下,方便使用解决方法glideinstall--strip-vendor--strip-vcs参考资料https://stackoverflo......
  • go: cannot find main module, but found glide.lock 问题解决
    解决方法exportGO111MODULE=auto说明此问题主要是老golang项目构建可能会出现的,新的一般不对有此问题(都基于gomod了)参考资料https://github.co......
  • abc289g题解
    考虑枚举卖出的物品个数\(i\),把\(b_i\)从大到小排序。题目的某人会买物品的条件转化为\(b_i\geqp_j-c_j\),这说明卖出的物品的集合是排序后\(b\)的一段前缀,且卖出\(i\)个......
  • 前端-vue基础96-vue router嵌套路由
      <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Documen......
  • 前端-vue基础98-vue router动态路由匹配
      <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Documen......
  • CF793G Oleg and chess 题解
    \(\text{类似于主席树优化建图,直接放一张图片。}\)#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<vector>#include<map>#include......
  • 【题解】CF997C Sky Full of Stars
    简记一下高维二项式反演的套路。思路高维二项式反演。首先意识到\(n\leq10^6\)且计数,并且求“至少”,所以考虑用二项式反演处理。这里如果用一维的二项式反演,可能......
  • 【题解】P4464 [国家集训队] JZPKIL
    仙气飘飘莫反题。显现出了很多推式子习惯的问题。思路莫反+伯努利数+Pr。首先根据\(\operatorname{lcm}(x,y)=\frac{xy}{\gcd(x,y)}\)可以化简:\(\sum\limits......
  • P9033题解
    P9033「KDOI-04」XORSum题解题目链接传送门题意简述构造一个长度为\(n\),值域为\([0,m]\)的异或和为\(k\)的序列,如果不存在则输出\(-1\)。题目分析首先很容易......
  • CF1268B题解
    CF1268B题解题目翻译给你一个杨表,用一个有\(n\)个元素的数组\(a\)表示杨表每一列的高度。你需要用\(1\times2\)或\(2\times1\)的骨牌填充这个杨表,求出最多......