10分求助

B2092 开关灯

peter_p_r @ 2024-09-15 14:54:28

#include<bits/stdc++.h>
using namespace std;
int a[5001]={};
int n;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        a[i]=1;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(a[i]%j==0){
                a[i]++;
            }
        }
    }
    for(int i=1;i<=n;i++){
        if(a[i]%2==0){
            cout<<i<<' ';
        }
    }
    return 0;
}

by wyb152511 @ 2024-09-15 15:14:10

第12和13行的i和j反了

应改为:

    if(a[j] % i == 0)
    {
      a[j]++;
    }

by peter_p_r @ 2024-09-15 15:36:07

@wyb152511 还是不行?


by wyb152511 @ 2024-09-15 15:38:57

说错了,是if(j % i == 0)


by THE_SUPER_WING @ 2024-09-15 15:39:35

看样例:输出的都是完全平方数。

为什么呢

假设一个灯1关了。 接下来people 1 开灯 接下来people 2 关灯,接下来people 3 开灯.......

如果开关次数是偶数就是关的状态, 否则就是开的。

重点来了!

我们可以把次数定为一个数的平方数,这样开关的次数就是这个平方数的约数。 而我们知道开关次数(也就是约数个数),只要是奇数就是开的状态。

我们知道约数总是成对出现,只有平方数的约数个数是奇数。

所以神奇代码就出来了

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= sqrt(n); i++)//通俗一点i * i <= n,跟好理解
    {
        cout << i * i << ' ';
    }
    return 0;
}

制作 ~~很容易~~,能不能给个关注


by peter_p_r @ 2024-09-15 15:40:22

@wyb152511 ok谢谢


|