P1876 开灯

记录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 个人会把所有编号是 1 的倍数的灯(即所有灯)打开。

  2. 第 2 个人会把所有编号是 2 的倍数的灯关闭。

  3. 第 3 个人会把所有编号是 3 的倍数的灯的状态切换(如果灯是开的就关上,关的就打开)。

  4. 依此类推,直到第 N 个人。

最后,我们需要找出哪些灯是开着的。

解决思路

  1. 灯的初始状态是关着的,只有被按了奇数次的灯才会最终是开着的。

  2. 每盏灯被按的次数等于它的编号的因数个数。例如,编号为 6 的灯会被编号为 1、2、3、6 的人各按一次,总共被按 4 次(偶数次)。

  3. 只有因数个数为奇数的灯会被按奇数次,最终保持开着的状态。

  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算法竞赛中的解题能力。通过实践和练习,你将能够更熟练地应用这些数学工具来解决复杂的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值