P1876 开灯

P1876 开灯_第1张图片

这道题明显不知原理,所以只能数组硬算,但是只过了一个点,其中还有一个点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<< " ";
}

你可能感兴趣的:(#,洛谷)