哈利波特与阿兹卡班囚徒 HZNUOJ2227
Description
小天狼星打算逃出阿兹卡班了。众所周知,阿兹卡班是一个从来没人能够逃出的监狱。因为每个囚徒都是单独牢房,且牢房内设施简陋。然而法力高强的小天狼星发明了一个强大又神奇的魔法。阿兹卡班一共关押了n个囚徒,且这个魔法能够让摄魂怪进行n次操作牢房房门开关,且第i次操作只能把编号为i的倍数的牢房门打开或者关闭。现在我们知道囚徒数n。求n次操作后,牢房门打开的牢房有多少个?
Input
正整数n(1<n<=10^6)。多组输入,直到EOF结束。
Output
每行输出一个正整数,对应每个n。
思路:
(1) 暴力破解 。
对于这样的问题最先想到的当然是暴力循环了。用一个装有1000000个元素的数组代表这1000000扇牢门,每一次操作对应元素的值变换一次。(但是本题的n比较大,直接循环会超时)。
1 #include<stdio.h> 2 #include<math.h> 3 int vis[1000010]; 4 int main(){ 5 int n; 6 while(scanf("%d",&n)!=EOF){ 7 for(int i=1;i<=n;++i)vis[i]=0;//初始化 8 for(int i=1;i<=n;++i){ 9 for(int j=i;j<=n;j=j+i){ 10 if(vis[j]==1)vis[j]=0; 11 else vis[j]=1; 12 } 13 } 14 int ans=0; 15 for(int i=1;i<=n;++i){ 16 if(vis[i]==1)ans++; 17 } 18 printf("%d\n",ans); 19 } 20 }
(2) 通过分析题意我们知道每次操作的都是次数的倍数所以我们可以通过求公约数来实现。
例如: 编号为12的牢门在第1,2,3,4,,6,12次被操作而 12=1*12=2*6=3*4一共按了6次 (偶数次)所以最后是关着的。
编号为9的牢门 在第1,3,9次被操作一共操作了奇数次,所以最后牢门是开着的。
(3)通过思路2我们知道了最后亮灯的都是按了奇数次的灯。同时在求约数时因为:N=a*b 有了a就有b。 所以最后牢门开着的只有完全平方数 。
1 #include<stdio.h> 2 #include<math.h> 3 int main(){ 4 int n; 5 while(scanf("%d",&n)!=EOF){ 6 printf("%d\n",(int)sqrt(n)); 7 } 8 }