【2014】扑克问题

来源:互联网 发布:spark入门书籍推荐知乎 编辑:程序博客网 时间:2024/04/28 14:32

Time Limit: 3 second
Memory Limit: 2 MB

有52张扑克牌,使它们全部正面朝上。从第2张牌开始,把凡是2的倍数位置上的牌翻成正面朝下;接着从第3张牌开始,把凡是3的倍数位置上的牌正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;接着从第4张牌开始,把凡是4的倍数位置上的牌按此规律翻转;依次类推,直到第1张牌是52张(第52张不翻)为止。统计最后有几张牌正面朝上,并打印出它们的位置。

Input

无输入

Output

第一行输出正面朝上的牌的张数
第二行依次输出牌的位置,用空格隔开,最后以回车结束

Sample Input

Sample Output

第一行输出正面朝上的牌的张数第二行依次输出牌的位置,用空格隔开,最后以回车结束

【题解】

只要按题目模拟就可以了.

5的话虽然是质数,但会被5整除,所以最后会是朝下。

16 有 2 8 4 4  1 16  但是4 只算一遍 1没有被算。最后是偶数,又翻回来。20的话有 2 10 4 5 1 20 但是1没有算 所以最后是奇数个,翻至背面。依次规律可以得知只有完全平方数才符合要求。同时还有52.。。。

【代码】

#include <cstdio>const int MAXN = 52;bool bo[MAXN+10];int num = 0,a[MAXN+10];void init() //先初始化数组 表示所有数都正面朝上{    for (int i = 1;i <= 52;i++)        bo[i] = true;}void get_ans(){    for (int i = 2;i <= 51;i++) //开始按照题目要求模拟即可 记住52不能翻。        for (int j = 2;j <= 52;j++)            if (j % i == 0)                bo[j] = 1-bo[j]; //这个算式可以表示翻面。}void output_ans(){    for (int i = 1;i <= 52;i++) //记录下答案 然后输出即可。            if (bo[i])                a[++num] = i;    printf("%d\n",num);    for (int i = 1;i <= num-1;i++)        printf("%d ",a[i]);    printf("%d\n",a[num]);}int main(){    init();    get_ans();    output_ans();    return 0;}


 

0 0