2 solutions
-
0
本题数据量小,可直接模拟求解,但这里还是给出一个时间复杂度和代码量略微优化的思路。
题中所有牌正面朝上,从第二张牌开始按照倍数翻转牌面。由此我们假设所有牌一开始都为正面朝下,从第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>
中。 -
0
#include <bits/stdc++.h> //头文件 using namespace std; //命名空间 int main() //主函数,程序入口 { bool a[53]={0}; int sum=0,b=0; for(int i=2;i<=52;i++) { for(int j=i;j<=52;j++) { if(j%i==0) { if(a[j]==0) a[j]=1; else a[j]=0; } } } for(int i=1;i<=52;i++) if(a[i]==0) sum++; cout<<sum<<endl; for(int i=1;i<=52;i++) { if(a[i]==0) { if(b==1) cout<<" "<<i; else cout<<i; b=1; } } return 0; //程序结束,返回 }
- 1
Information
- ID
- 227
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 8
- Tags
- # Submissions
- 39
- Accepted
- 15
- Uploaded By