代码先锋网 代码片段及技术文章聚合

组合数学--51Nod 1556 计算

技术标签: 组合数学

传送门

组合数学好题!
首先考虑题目要求,在一个数xx后面填的数可以是x,x1,x+1x,x-1,x+1,把数列看做网格图,把+1+1看做右上走一步,1-1右下,00往右,问题变成了从(0,0)>(n1,m)(0,0)->(n-1,m)不穿过x=0x=0的方案数,根据套路,可以用总-穿过的,穿过的就可以用(0,0)(0,0)关于x=1x=-1对称一下,就是(0,2)>(n1,m)(0,-2)->(n-1,m)的方案数

首先枚举往右走的步数ii,再枚举最后走到的那个mm,就可以这样算:
ans=i=0nCn1i×j=(ni1)&1,j&1=(ni1)&1ni1Cni1ni+j12Cni1ni+j+12ans=\sum_{i=0}^n C_{n-1}^i\times \sum_{j=(n-i-1)\&1,j\&1=(n-i-1)\&1}^{n-i-1}C_{n-i-1}^{\frac{n-i+j-1}{2}}-C_{n-i-1}^{\frac{n-i+j+1}{2}}
观察式子,因为每次相当于给j+=2j+=2,所以除二就能消掉,就变成了杨辉三角中一行的一半,然后前面后面相差一,所以中间都抵消了,最后就变成:
ans=i=0nCnii×{Cni1ni2(ni1)&1Cni1ni12!(ni1)&1ans=\sum_{i=0}^nC_{n-i}^i\times \begin{cases}C_{n-i-1}^{\frac{n-i}{2}}&(n-i-1)\&1\\C_{n-i-1}^{\frac{n-i-1}{2}}&!(n-i-1)\&1\end{cases}

放上我并列第一快 的代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define maxn 1000005
#define LL long long
using namespace std;
int n,fac[maxn],inv[maxn];
const int mod=1e9+7;
LL ans;

inline int qpow(int x,int k){
	int ret=1;
	while(k){
		if(k&1) ret=1LL*ret*x%mod;
		x=1LL*x*x%mod; k>>=1;
	} return ret;
}

inline int C(int n,int m){ return 1LL*fac[n]*inv[m]%mod*inv[n-m]%mod;}

int main(){
	scanf("%d",&n); fac[0]=1;
	for(int i=1;i<=n;i++) fac[i]=1LL*fac[i-1]*i%mod;
	inv[n]=qpow(fac[n],mod-2);
	for(int i=n;i;i--) inv[i-1]=1LL*inv[i]*i%mod;
	for(int i=0;i<=n;i++){
		if((n-i-1)&1) (ans+=1LL*C(n-1,i)*C(n-i-1,(n-i)>>1)%mod)%=mod;
		else (ans+=1LL*C(n-1,i)*C(n-i-1,(n-i-1)>>1)%mod)%=mod;
	}
	printf("%lld\n",ans);
	return 0;
}
版权声明:本文为sizeof_you原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sizeof_you/article/details/84855436

智能推荐

51nod1556 计算(默慈金数)

Problem 有一个\(1*n\)的矩阵,固定第一个数为\(1\),其他填正整数, 且相邻数的差不能超过\(1\),求方案数。 \(n\le 10^6\) Solution 容易发现答案是\(f_n=f_{n-1}*3-g_{n}\)。 其中\(g_i\)表示从\((0,0)\)走到\((i,0)\)可以向上,向下向右走一格,但是只能在第一象限的方案数。 然后这个显然可以用 组合数 + 卡特兰数...

51Nod 1556 默慈金数(Motzkin numbers)

题目链接 题意: 有一个1*n的矩阵,固定第一个数为1,其他填正整数 ,且相邻数的差不能超过1,求方案数%1e9+71e9+7的结果。 思路: 显然: 如果第ii个格子的数是1,则第i+1i+1个格子只有11或者22两种可能 而如果第ii个格子的数不为1,则第i+1i+1个格子一定有三种可能。 则当考虑1∗n1∗n矩阵填法的方案数时,如果我们已经知道了1∗...

POJ 1556 计算几何+最短路

     代码1:     代码2:    ...

poj 1556 计算几何+最短路

主要是构图花了不少时间,应该一小时能够搞定的,却花了三个小时,最大的原因是初始化没有做好 说下题目,我们给每个点一个编号,然后求出每两个点之间的最短路径,肯定是直线最短。 然后为了简化,我们可以只求这个点和他后面的点的关系(因为必然可以向前走,不可能折回来再往前走才是最短的), 注意一点,不是每两个点之间都能直达的,得判断其中经过的路径有没有被墙堵住了(判断直线和线段的关系 ) 判断如下 图构好之...

猜你喜欢

POJ - 1556 【计算几何 + 最短路】

The Doors 题意 : 给出一个房间,大小为10×10,起点在(0,5),终点在(10,5),房间中有若干堵墙,问从起点到终点的最短路径。 题解 : 枚举每两点,如果这两个点构成的线段没有与房间中的任何一线段相交,那么就建一条边,所有边建完之后跑一边迪杰斯特拉就好了。...

组合数学--51Nod 1627 瞬间移动

传送门 隔板法裸题 枚举走了几步,然后隔板法,不允许空...

【51nod 1161】 Partial Sums (组合数学)

题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出一个数组A,经过一次处理,生成一个数组S,数组S中的每个值相当于数组A的累加,比如:A = {1 3 5 6} => S = {1 4 9 15}。如果对生成的数组S再进行一次累加操作,{1 4 9 15} => {1 5 14 29},现在给出数组A,问进行K次操...

51nod 1627 瞬间移动(组合数学)

传送门 解题思路   因为每次横纵坐标至少\(+1\),所以可以枚举走的步数,枚举走的步数\(i\)后剩下的就是把\(n-1\)与\(m-1\)划分成\(i\)个有序正整数相加,所以用隔板法,\(ans=\sum\limits_{i=1}^{min(n,m)-1} C(n-2,i-1)*C(m-2,i-1)\) 代码...

Maven配置本地仓库 Maven项目使用本地仓库

Maven配置本地仓库 Maven项目使用本地仓库 项目部署或开发环境没有外网的情况下, 需要配置本地仓库. 由于是在内网环境,maven无法连接互联网,所以只能事先将jar下载到本地,然后通过配置pom文件,将jar引用至本地仓库即可。 修改maven的settings.xml文件 配置本地仓库目录 修改maven项目中的pom.xml 添加如下配置 配置环境变量 参考链接: https://b...