P1876 开灯

对于每一个数n,除非它是完全平方数,否则它一定有偶数个因子。

因为如果i是n的因子,那么n/i也一定是n的因子。这样,n的因子都是成对出现的,所以n有偶数个因子

但是,有一种特殊情况,即n/i=i。由于i和n/i是同一个数,因子只能是一个,这时n的因子就是奇数个。

把n/i=i变形,得n=i*i,即n是完全平方数,所以只有完全平方数有奇数个因子。

对于本题,由于灯只有两种状态(开或关,可类比于奇数和偶数),而初始状态是关的,而每个灯泡如果能被人的编号整除,状态就会变化。

把整个过程看成一个整体,也就是只有这一盏灯的因数的编号的人,才会按开关。由于灯的开关按偶数次状态不变,所以,灯的开关只有按奇数次,才会开。

发现问题和上述提到的只有完全平方数有奇数个因子的问题是一样的,也就是如果灯的编号是完全平方数,那么它会被按奇数次,最后就是开着的。

LL n;

int main()
{
    cin>>n;

    for(int i=1;i<=n/i;i++)
        cout<<i*i<<' ';
    cout<<endl;
    //system("pause");
    return 0;
}
posted @ 2021-04-03 23:17  Dazzling!  阅读(63)  评论(0编辑  收藏  举报