首页 > 其他分享 >【2023.11.08】NOIP2023模拟试题-30

【2023.11.08】NOIP2023模拟试题-30

时间:2023-11-08 18:12:46浏览次数:33  
标签:f1 f2 ch 删除 int 2023.11 30 fi NOIP2023

前言

数论迎我归,数学送我葬

组合数学不容易,又有 DP 当

T3 刚爆零,T4 又遭殃

OI 路上怅前望,且行且彷徨

T1 最大公约数

T1 应该想一想就会,接下来我们讨论是怎么减去他的复杂度的。

题目的关键在于,如果根据给出的 \(a\) 推出 \(\gcd\) 的话,就会有 \(9\times 10^{10}\) 条推导关系。

而如果根据给出的 \(\gcd\) 反向找 \(a\) 的话,就只有 $10^6 \log 10^6 $ (均摊 \(\log n\) ) 条推导关系。这就是为什么反向推导会更简单的原因。

#include<bits/stdc++.h>
using namespace std;
#define fi(l,r) for(int i=l;i<=r;++i)
#define ff(i,l,r) for(int i=l;i<=r;++i)
#define ll long long
#define ly __int128
#define lp ll
#define lson(x) ((x)<<1)
#define rson(x) (lson(x)|1)
#define Lson(x) tr[lson(x)]
#define Rson(x) tr[rson(x)]
#define mod %P
#define N 300005
int n,kk,cur,amax;
struct Pi{int x,y;bool operator < (const int b){return x<b;}}a[N];
bool operator < (const int x,Pi y){return x<y.x;}
bool Pi_cmp_by_x(Pi x,Pi y){return (x.x==y.x)?x.y<y.y:x.x<y.x;}
int main(){
	freopen("gcd.in","r",stdin);
	freopen("gcd.out","w",stdout);
	scanf("%d %d",&n,&kk);
	fi(1,n){
		scanf("%d",&a[i].x);
		a[i].y=i;
		amax=max(amax,a[i].x);
	}
	sort(a+1,a+n+1,Pi_cmp_by_x);
	for(cur=amax;cur>=1;--cur){//分别枚举每一个 gcd
		int f1=n+1,f2=0;Pi*j=a;
		for(int i=cur;i<=amax;i+=cur){//在 a 中查找有没有 gcd 的倍数
			j=lower_bound(j,a+n+1,i);
			if(j==a+n+1)break;
			if(j->x==i){
				f1=min(f1,j->y),f2=max(f2,j->y);
				j=upper_bound(j+1,a+n+1,i)-1;
				f1=min(f1,j->y),f2=max(f2,j->y);//记录满足条件的最小和最大下标
			}
		}
		if(f1+kk<=f2){//如果存在
			printf("%d",cur);
			return 0;
		}
	}
	printf("1\n");
	return 0;
}

T2 子序列

我们可以把题目转化成长度为 \(n\) 的删除序列有多少种,两种不同当且仅当有至少一个删除操作删除的字符不同。

然后我们发现左边无论怎么删都跟我右边没有关系,所以考虑分治。

先考虑

:

我们钦定只考虑 \([l,r]\) 区间内的数的删除方式有 \(f_{l,r}\) 种。

↓一个长度为11的01串

长度为11的01串

我们随便来一组分治,然后假定 \(L,R\) 区间已经搞定被删除掉了,即将要删除 \(this\) 所在的字符:

长度为11的分治01串

剩下的串是 1011,要删除第一个 1 ,合规。

我们再考虑这样的分治

长度为11的分治01串2

我们发现将要删除一个 0,但删这个 0 和删红色 0 最终得到的删除序列是一样的,这个时候我们钦定每次只删连续区间里最后一个字符来避免重复。

if (r==n||s[i]!=s[r+1])
	ans=(ans+1ll*C[r-l][i-l]*dfs(l,i-1)%mod*dfs(i+1,r))%mod;

这里的 if 语句就是用来干这个的(在最长的序列里不会重复所以所有字符都可以删除)

我们发现分治到 \(l<r\) 的情况可以直接算为 \(1\) ,而 \(l=r\) 的情况有可能是 \(0\) (如果和后面的第一个没删除的字符相同),但也有可能是 \(1\) (如果和后面的第一个没删除的字符不同)

然后我们考虑

以下的红色数字是 \(L,R\) 两个区间的分别的任意一组删除序列

长度为3或4的01串删除序列

考虑和归并排序一样的合并方法,容易知道一共有 \(C_{|L|+|R|}^{|L|}\) 种方式来按顺序合并两个序列。中间的 1 是最后删。举个例子,合并过后的一种删除序列长这样:

长度为7的01串删除序列

到这里这道题就做完了,以下是完整代码:

(因为有的 \(f\) 算出来可能是 \(0\) , 所以 \(f\) 要初始化成 \(-1\))

#include<bits/stdc++.h>
using namespace std;
#define fi(l,r) for(int i=l;i<=r;++i)
#define ff(i,l,r) for(int i=l;i<=r;++i)
#define ll long long
#define ly __int128
#define lp ll
#define lson(x) ((x)<<1)
#define rson(x) (lson(x)|1)
#define Lson(x) tr[lson(x)]
#define Rson(x) tr[rson(x)]
#define P 1000000007
#define mod %P
#define N 405
ll f[N][N],C[N][N];
int n,s[N];
ll getf(int l,int r){
	if(l>r)return 1;
	if(f[l][r]!=-1)return f[l][r];
	ll ret=0;
	fi(l,r)
		if(n==r||s[i]!=s[r+1])ret=(ret+getf(l,i-1)*getf(i+1,r)%P*C[r-l][r-i]%P)%P;
	return f[l][r]=ret%P;
}
int main(){
	memset(f,-1,sizeof f);
	freopen("sub.in","r",stdin);
	freopen("sub.out","w",stdout);
	scanf("%d",&n);
	char ch=getchar();while(ch!='0'&&ch!='1')ch=getchar();
	fi(1,n){
		s[i]=ch-'0';
		ch=getchar();
	}
	fi(0,n){
		C[i][0]=1;
		ff(j,1,i)C[i][j]=(C[i-1][j]+C[i-1][j-1])%P;
	}
	printf("%lld\n",getf(1,n)%P);
	return 0;
}

标签:f1,f2,ch,删除,int,2023.11,30,fi,NOIP2023
From: https://www.cnblogs.com/DZhearMins/p/17818040.html

相关文章

  • OGG-00730报错处理
    问题概述在ogg的迁移过程中,启动抽取进程后,出现如下报错:ERROROGG-00730Nominimumsupplementalloggingisenabled.Thismaycauseextractprocesstohandlekeyupdateincorrectlyifkeycolumnisnotinfirstrowpiece.问题原因根据报错提示,当前数据库不是最细log......
  • 【2023-10-30】乡土人情
    20:00与简单的误解不同的是,偏见会积极抗拒所有可能撼动它的证据。当我们的偏见与现实发生冲突时,我们倾向于意气用事。                                                 ......
  • 洛谷P3046 海底高铁 巧用差分统计经过区间次数
    洛谷P3046海底高铁-差分统计经过区间次数题目贴在这里P3406海底高铁-洛谷|计算机科学教育新生态(luogu.com.cn)分析本题题干很长,但是题意理解很简单。就是给定n个节点,每次仅能在相邻的两个节点之间移动,且任意两个节点之间的高铁费用也不一样。依据题意,假设从3节点到1......
  • 30张图详解IP地址网络知识
    你们好,我的网工朋友。IP地址是所有网络初级课程里最先涉及到的技术点,对于IP地址的合理规划是网络设计的重要环节,必须拿捏。IP地址规划的好坏,影响到网络路由协议算法的效率,影响到网络的性能,影响到网络的扩展,影响到网络的管理,也必将直接影响到网络应用的进一步发展。今天和你分享一篇......
  • Apache DolphinScheduler PMC代立冬荣获中关村U30青年创业者荣誉
    北京,[2023年11月3日]—在中关村举行的U30年度优胜者见面交流会上,白鲸开源科技的联合创始人代立冬先生荣幸被选为年度优胜者之一。这是对代先生及白鲸开源科技在云原生DataOps平台领域创新成就的高度认可。中关村U30是由中国科协科学技术传播中心、共青团北京市委员会、北京市科......
  • 记录2023.11.7算法分析与应用课程学习
    题目-迷宫scanner是键盘录入底下的n=sc.nextInt();是输入内容;可以在地下输入东西录入进去的意思java中的next和nextline的区别简单的java键盘输入代码起别名sc可以任意取名字将键盘的数据赋值给变量sc.next就是相对于Scanner(System.in).next输入的名称=定义的名称 输入的密码=定......
  • NOIP2023模拟13联测34 总结
    NOIP2023模拟13联测34总结目录NOIP2023模拟13联测34总结比赛过程题目A.origen题目大意思路B.competition题目大意思路C.tour题目大意D.abstract题目大意比赛过程看了一下题,感觉就\(T2\)有一点思路。\(T1\)先打一个\(30\)分暴力,感觉要分位考虑,想了大概\(1h\)就跳......
  • 2023.11.7值得推荐的一款服务器空间
    ,已经体验一个月咯,非常不错的免费资源,适合大家去了解了解~!他们家的免费空间,免费服务器,非常稳定,非常靠谱,值得拥有,价格厚道~!免备案服务,域名管理等等服务,应有尽有,2023年你值得了解,他们家的免费云服务器还是独立IP的哦,非常非常好,非常NICE~!官网地址:https://www.sanfengyun.com......
  • 2023.11.7——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.mybatis明日计划:学习......
  • NOIP2023模拟13联测34 B.competition
    NOIP2023模拟13联测34B.competition目录NOIP2023模拟13联测34B.competition题目大意思路code题目大意现在有\(n\)个区间\([l_i,r_i]\),现在问你选取若干的连续的区间的区间并的大小的和。思路设\(pre_{i,j}\)表示前\(i-1\)个区间内,包含点\(j\)的最靠右的......