洛谷带刷100题(T16-T20)

洛谷带刷100题(T16-T20)

2025.03.19

T16 连续自然数和

题目简介:双指针枚举的一道数学计算题,是个很不错的数学入门题

分析题干

1.连续自然数和,用等差数列求和公式得

\[(l+r)(r-l+1)=2M \]

\[l<r \]

因此我们需要对2M因式分解,找满足条件的因子,代码如下:

	for(int i = 2;i<=2*M/i;i++){
		if(2*M%i)continue;
		x.push_back(i);
		if(i!=2*M/i)x.push_back(2*M/i);
	}

列出方程组求解

\[\begin{cases} r=\frac{xi+xj+1}{2}\\ l=xi-r \end{cases} \]

其中xi是左端点,xj是右端点

遍历存储因子的vector容器,首先要满足是2的因子,再根据刚开始得到的数学等式判断

	for(auto&x1:x){
		for(auto&x2:x){
			if((x1+x2-1)%2)continue;
			int r = (x1+x2-1)/2;
			int l = x1-r;
			if(0<=l&&l<=r&&(l+r)*(r-l+1)==2*M){
				ans.push_back({l,r});
			}
		}
	}

最后排序输出结果,存储pair类型的vector容器输出也贴这里lou一眼

	for(auto&[x,y]:ans) cout<<x<<" "<<y<<endl;

T17 笨小猴

题目简介:哈希+最大值+素数判断

很简单呐,代码都没敲,过了吧


T18 迷宫

题目简介:带有障碍的记忆化搜索的模板题

注意点

1.dx,dy四个方向遍历深搜

2.回溯,还原现场

3.检查边界和障碍,是否访问过

ez


T19 合并果子

题目简介:优先队列(堆)的应用

注意点

1.priority_queue<int,vector,greater>pq;优先队列的参数,排序默认是大顶堆,与sort相反

2.ans记录结果记得开long long,否则卡数据


T20 产生数

题目简介:深度优先搜索+高精度

注意点

1.用二维数组存储图,再对每个一维数组(一个数可以变换到的)进行深度优先搜索,搜到的用bitset置为true,将true的数量存到cnt数组中对应的数字中

2.有种图论中邻接表的思想,每一位都存储着一串数,有几个数就是几种变换


一些技巧

bitset<N>vis;

bitset相较于bool的优势在于速度快,一位存储一位,类似于二进制

bitset.count();
bitset.reset();

上述函数让bitset的功能更加强大,也是本题的关键代码

此外,__int128的数值不能直接输出,要写一个输出函数,具体如下

void output(__int128 x){
	if(x/10) output(x/10);
	putchar(x%10+'0');
}
posted @ 2025-03-19 23:57  Fllipped  阅读(43)  评论(0)    收藏  举报