洛谷带刷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
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');
}

浙公网安备 33010602011771号