2 solutions

  • 0
    @ 2024-4-27 10:40:26

    本题数据量小,可直接模拟求解,但这里还是给出一个时间复杂度和代码量略微优化的思路。

    题中所有牌正面朝上,从第二张牌开始按照倍数翻转牌面。由此我们假设所有牌一开始都为正面朝下,从第i张牌开始翻转i的倍数对应的扑克牌。此时,我们可以发现第n张牌的翻转次数由n的因数个数决定。易知当n非完全平方数时,其因数个数(也就是翻转次数)必为偶数,即翻转完成后仍然正面朝下;当n为完全平方数时,其因数个数为奇数,翻转过程结束后为正面朝上。(注:能表示成一个整数的平方的数即为完全平方数。)

    所以我们直接编程筛选1~52之间的完全平方数。由于核心代码量极少,可以3行解决(不考虑输出格式的情况下),因此建议各位自行编写程序解决,这里给出一段扑克牌总数为n的情况下的核心代码参考。

    printf("%d\n",sqrt(n));
    for(int i=1;i<=sqrt(n);++i)
        printf("%d ",i*i);
    

    sqrt(n)函数定义于头文件 <cmath>中。

    Information

    ID
    227
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    8
    Tags
    # Submissions
    35
    Accepted
    11
    Uploaded By