这道题明显不知原理,所以只能数组硬算,但是只过了一个点,其中还有一个点MLE(内存超标)人生第一次
#include
#include
using namespace std;
int main()
{
int n;cin >> n;
int *a = new int[n+1];
memset(a,0,sizeof(a));
for(int i = 1;i <= n;i++)
{
if(i == 1)
{
for(int j = 1;j <= n;j++)
a[j] = 1;
}
else if(i == 2)
{
for(int j = 1;j <= n;j++)
if(i % j == 0)
a[j] = 0;
}
else
{
for(int j = 1;j <= n;j++)
if(j%i == 0)
a[j] ^= 1;
}
}
for(int i = 1;i <= n;i++)
if(a[i])
cout << i << " ";
}
这道题的用意就不是让我们去暴力枚举,这样一定是会超过内存的。我们来想这件事,最开始所有的灯都是关闭的,如果在n次操作后,灯还能亮着,那就说明灯被按动了奇数次,因为如果是偶数次,灯一定最终还是最初的状态。
而按动灯的依据是第k盏灯在它之前有几个因数,有奇数个因数则能亮着。我们都知道,对于非完全平方数n,如果i是他的一个因数,那么n/i也是一个因数,非完全平方数的因数是对称分布的,而对于完全平方数,因为i = n/i 所以将具有奇数个因数,所以我们只需要将1-n中的完全平方数输出就可以啦
#include
#include
using namespace std;
int main()
{
int n;cin >> n;
for(int i = 1;i*i <= n;i++)
cout << i*i<< " ";
}