MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

题目地址:
         http://acm.hdu.edu.cn/showproblem.php?pid=2053
题目描述:
Problem Description
There are many lamps 
in a line. All of them are off at first. A series of operations are carried out on these lamps. On the i-th operation, the lamps whose numbers are the multiple of i change the condition ( on to off and off to on ).
 

Input
Each test 
case contains only a number n ( 0< n<= 10^5in a line.
 

Output
Output the condition of the n
-th lamp after infinity operations ( 0 - off, 1 - on ).
 

Sample Input
1
5
 

Sample Output
1
0

Hint
hint
 

Consider the second test 
case:

The initial condition       : 
0 0 0 0 0 …
After the first operation  : 
1 1 1 1 1 …
After the second operation : 
1 0 1 0 1 …
After the third operation  : 
1 0 0 0 1 …
After the fourth operation : 
1 0 0 1 1 …
After the fifth operation  : 
1 0 0 1 0 …

The later operations cannot change the condition of the fifth lamp any more. So the answer 
is 0.

题目分析:
毫无疑问 , 从后面的 Consider the second test case 可以看出, 这是一道模拟题, 根据题意直接模拟即可!

代码如下:
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

#include 
<iostream>
#include 
<string.h>
using namespace std;
 
int arr[100001];
 
int main()
{
    
int n;
    
while(scanf("%d"&n) != EOF)
    {
        memset(arr, 
0sizeof(arr));
        
for(int i=1; i<=n; ++i)
            
for(int j=1; j<=n&&j*i<=n; ++j)
                arr[j
*i] = !arr[j*i];
        printf(
"%d\n", arr[n]);
    }
    
return 0;
}

但是这样非常耗时,  有没更简单的方法? 当然有!  在草稿纸上模拟后得出: 只要是平方数就是 "1" ,否则为"0" , 所以
直接哈希,0MS过.

代码如下:
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

#include 
<iostream>
using namespace std;
int F[100001= { 11 };
int main ()
{
    
for ( int i = 2; i * i <= 100000 ; ++ i )
    {
          F[ i 
* i ] = 1;
    }
    
int N;
    
while ( cin >> N )
    {
          puts ( F[N] 
? "1" : "0" ); 
    }
    
return 0
}
 posted on 2010-08-18 15:36  MiYu  阅读(296)  评论(0编辑  收藏  举报