题目地址:
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 ^ 5 ) in 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 .
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 ^ 5 ) in 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, 0 , sizeof (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 ;
}
#include < iostream >
#include < string .h >
using namespace std;
int arr[ 100001 ];
int main()
{
int n;
while (scanf( " %d " , & n) != EOF)
{
memset(arr, 0 , sizeof (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 ] = { 1 , 1 };
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 ;
}
#include < iostream >
using namespace std;
int F[ 100001 ] = { 1 , 1 };
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 ;
}