记录32
#include <bits/stdc++.h>
using namespace std;
int main(){
long long n;
cin>>n;
for(int i=1;i*i<=n;i++) if(i*i<=n) cout<<i*i<<" ";
return 0;
}
题目传送门
https://www.luogu.com.cn/problem/P1876
突破点
首先所有的灯都是关的(注意是关!),编号为 1 的人走过来,把是 1 的倍数的灯全部打开,编号为 2 的人把是 2 的倍数的灯全部关上,编号为 3 的人又把是 3 的倍数的灯开的关上,关的开起来……直到第 N 个人为止。
给定 N,求 N 轮之后,还有哪几盏是开着的。
思路
其实就是把对应编号的倍数,然后把灯的状态取反,一开始是关
假设有一排灯,编号从 1 到 N,最开始所有的灯都是关着的。接下来会有 N 个人依次走过这排灯:
-
第 1 个人会把所有编号是 1 的倍数的灯(即所有灯)打开。
-
第 2 个人会把所有编号是 2 的倍数的灯关闭。
-
第 3 个人会把所有编号是 3 的倍数的灯的状态切换(如果灯是开的就关上,关的就打开)。
-
依此类推,直到第 N 个人。
最后,我们需要找出哪些灯是开着的。
解决思路
-
灯的初始状态是关着的,只有被按了奇数次的灯才会最终是开着的。
-
每盏灯被按的次数等于它的编号的因数个数。例如,编号为 6 的灯会被编号为 1、2、3、6 的人各按一次,总共被按 4 次(偶数次)。
-
只有因数个数为奇数的灯会被按奇数次,最终保持开着的状态。
-
因数个数为奇数的情况只发生在平方数上。这是因为平方数的因数是成对出现的,但平方根只算一次。例如,9 的因数是 1、3、9,共 3 个(奇数次)。
最终结论
最后开着的灯的编号一定是平方数。例如:
-
当 N = 10 时,平方数有 1、4、9,所以最后开着的灯是编号为 1、4、9 的灯。
代码简析
#include <bits/stdc++.h>
using namespace std;
int main(){
long long n;
cin>>n;
for(int i=1;i*i<=n;i++) if(i*i<=n) cout<<i*i<<" ";
return 0;
}
知道思路后,我们只需要对平方数进行处理就行了
找出n内所有的平方数即可
补充
在CSP-J算法竞赛中,良好的数学基础对于解决许多问题至关重要。以下是一些常用的数学处理手段,它们可以帮助你高效地解决竞赛中的问题:
1. 数论
最大公约数(GCD)和最小公倍数(LCM):用于解决涉及分数、比例和数论的问题。
素数筛法(埃拉托色尼筛法):用于快速找到一定范围内的所有素数。
模运算:处理涉及大数的问题,避免整数溢出。
快速幂算法:快速计算大数的幂次,常用于加密算法和数论问题。
2. 组合数学
排列组合:计算排列数和组合数,用于概率计算和计数问题。
容斥原理:解决涉及多个集合的计数问题。
鸽巢原理:用于证明某些情况的存在性。
3. 概率与统计
概率计算:评估事件发生的可能性。
期望值:计算随机变量的平均值。
数据分布:理解数据的分布特性,如均值、中位数、众数等。
4. 序列与数列
等差数列和等比数列:处理涉及序列求和或查找特定项的问题。
斐波那契数列:解决涉及递推关系的问题。
5. 代数
线性方程组:解决涉及多个未知数的问题。
矩阵运算:包括矩阵加法、乘法,用于解决系统方程和图形变换问题。
多项式运算:如多项式加法、乘法和因式分解。
6. 离散数学
图论:处理图的遍历、最短路径和网络流等问题。
集合运算:包括集合的交、并、补运算。
逻辑推理:用于解决涉及命题逻辑和布尔代数的问题。
7. 计算几何
几何形状的性质:如面积、周长、体积的计算。
点、线、面的关系:判断点是否在多边形内,线段是否相交等。
向量运算:包括向量加法、减法、点积和叉积。
8. 动态规划中的数学
状态转移方程:建立动态规划的状态转移关系。
优化技巧:如矩阵快速幂优化线性递推。
9. 数列生成与分析
递推关系:利用递推公式生成数列。
数列求和:计算数列的部分和或总和。
10. 快速傅里叶变换(FFT)
多项式乘法:快速计算两个多项式的乘积。
信号处理:用于音频和图像处理中的频域分析。
掌握这些数学处理手段可以显著提高你在CSP-J算法竞赛中的解题能力。通过实践和练习,你将能够更熟练地应用这些数学工具来解决复杂的问题。

被折叠的 条评论
为什么被折叠?



