Posted on 2010-08-07 15:20
MiYu 阅读(657)
评论(0) 编辑 收藏 引用 所属分类:
ACM ( 模拟 ) 、
ACM ( 水题 )
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^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;
}
但是这样非常耗时, 有没更简单的方法? 当然有! 在草稿纸上模拟后得出: 只要是平方数就是 "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;
}