首页 > 其他分享 >组合数学

组合数学

时间:2023-06-22 20:11:24浏览次数:31  
标签:组合 int 棋子 数学 ans 移动 我们 mod

B. AquaMoon and Chess

Problem - 1545B - Codeforces

题意:给定一个1*n的方格,有些方格有棋子,每个棋子可以这样移动:

1,当i,i+1有棋子且i+2<=n时,可以将i移动到i+2的位置。

2,当i,i-1有棋子且i-2>0,可以将i移动到i-2位置上。

给定初始棋子分布,问有多少中可能到达的情形。

n<=1e5

题解:什么样的棋子才能移动?我们发现如果一个棋子与另一个棋子成对,那么可以遍历整个空间。

如果有落单棋子,那么其不能动。分组难以统一,我们想把其先变成全部在一侧的情形再进行考虑。我们发现将所有可以移动的棋子全部移到最左边后,出现了形如1111110001000100101000情况,这时分组唯一确定,即最左边开始两两一组。若我们视两个组成一组,则我们认为1组的移动为整体向右平移一位,且我们发现若将 011100->01110我们可以认为是跨过了单独的1。若设单独的棋子有l个,组有x个,这样我们便可以将问题等价为求n-l-x个位置中选x个位置有多少种方法,结果显然。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10,mod=998244353;
int a[N];
int fac[N],finv[N];
int qpow(int x,int y){
	int ans=1;
	while(y){
		if(y&1) ans=ans*x%mod;
		x=x*x%mod;
		y>>=1;
	}	
	return ans;
}

int C(int n,int k){
	if(n<k) return 0;
	if(n==0) return 0;
	return fac[n]*finv[n-k]%mod*finv[k]%mod;
}

signed main(){
	int w=2e5;
	fac[0]=1;
	for(int i=1;i<=w;i++){
		fac[i]=fac[i-1]*i%mod;
	}
	finv[1]=1;
	for(int i=2;i<=w;i++) finv[i]=qpow(fac[i],mod-2);
	int T;cin>>T;
	while(T--){
		int cnt=0,x=0,l=0;
		int n;cin>>n;
		string s;cin>>s;
		for(int i=1;i<=n;i++) a[i]=s[i-1]-'0';
		for(int i=1;i<=n;i++){
			if(a[i]==0){
				if(cnt%2) cnt--,l++;
				x+=cnt/2;
				cnt=0;
			}
			else cnt++;
		}
		if(cnt){
			if(cnt%2) cnt--,l++;
			x+=cnt/2;
		}
		int ans=1;
		ans=max(ans,C(n-x-l,x));
		cout<<ans<<endl;
	}
}

标签:组合,int,棋子,数学,ans,移动,我们,mod
From: https://www.cnblogs.com/wjhqwq/p/17498246.html

相关文章

  • P2433 【深基1-2】小学数学 N 合一
    【深基1-2】小学数学N合一题目描述问题1请输出IloveLuogu!问题2这里有$10$个苹果,小A拿走了$2$个,Uim拿走了$4$个,八尾勇拿走剩下的所有的苹果。我们想知道:小A和Uim两个人一共拿走多少苹果?八尾勇能拿走多少苹果?现在需要编写一个程序,输出两个数字作为答......
  • POSTGRESQL 短查询优化,独立索引与组合索引 8
    这是一个关于POSTGRESQL查询的优化系列,这已经是这个系列的第八集了,接上期,在OLTP查询中我们需要注意的查询优化的地方非常多,稍不留意就会在一些问题上的操作导致查询的数据逻辑错误。继续上次的问题,在查询中,针对事件的查询问题,我们一般处理的模式 1 针对具体事件字段的时间标注......
  • NHC/ODO/INS组合原理
    毕业论文中非完整约束部分推导有误,所以更正一下! ......
  • 组合模式
    #include<iostream>#include<list>#include<string>usingnamespacestd;//componentclassIFile{public:virtualvoiddisplaye()=0;virtualintadd(IFile*iFile)=0;virtualintremove(IFile*iFile)=0;virtuall......
  • <学习笔记>组合数学
    ####插板法问题一:现有$n$个完全相同的元素,要求将其分为$k$组a,保证每组至少有一个元素,一共有多少种分法?考虑拿$k-1$块板子插入到$n$个元素两两形成的$n-1$个空里面。所以答案就是$$\binom{n-1}{k-1}$$问题二:如果问题变化一下,每组允许为空呢?显然此时没法直接插板......
  • Copula估计边缘分布模拟收益率计算投资组合风险价值VaR与期望损失ES|附代码数据
    全文链接:http://tecdat.cn/?p=24753最近我们被客户要求撰写关于风险价值的研究报告,包括一些图形和统计输出。在这项工作中,我通过创建一个包含四只基金的模型来探索copula,这些基金跟踪股票、债券、美元和商品的市场指数摘要然后,我使用该模型生成模拟值,并使用实际收益和模拟收......
  • 2023年新课标全国Ⅱ卷数学真题Word解析版
    前言真题图片相关下载2023年新课标全国Ⅱ卷数学真题版+解析版,提取码请微信联系:wh1979448597.......
  • 期末考试YTU4035: Shmily(数学,等差数列)
    考试的时候看到这道题一眼前缀和,但是想了想要枚举每个区间是不是复杂度有点高,还是交上去了不出意外的 $TLE$ 了,想了十来分钟还是没想到怎么优化,考完问了一下大佬,原来用等差数列1ms就能过,听说双指针0ms(蒟蒻的我呜呜)众所周知等差数列的前$N$项和是$S$=a1 *n+(n*(n......
  • Add Modulo 10(数论,思维,数学,规律)
    思路:找规律情况一:尾数为5或0为5时进行一次操作变成0的情况。而尾数是 0 时操作无意义,所有数必须相等。情况二:尾数为 1,3,7,9可进行一次操作变成情况三。情况三:尾数为 2,4,6,8我们通过找规律发现:2⇒4⇒8⇒16⇒224⇒8⇒16⇒22⇒246⇒12⇒14⇒18⇒268⇒16⇒22⇒24⇒28......
  • Go 设计模式|组合,一个对数据结构算法和职场都有提升的设计模式
    Go设计模式|组合,一个对数据结构算法和职场都有提升的设计模式原创 KevinYan11 网管叨bi叨 2023-01-1608:45 发表于北京收录于合集#用Go学设计模式24个大家好,我是每周在这里陪你进步的网管~,这次我们继续设计模式的学习之旅。本次要学习的是组合模式,这个模式呢,平时要做......