Main » 2012 » November » 1 » [Tyvj 1965] 汪星人入侵
2:11 PM
[Tyvj 1965] 汪星人入侵

【题目背景】

(Rainbow和Freda正在城堡里玩得开心的时候,外面传来一阵声音:小猫乖乖,把门开开~)
Rainbow:不好!是汪星人入侵!
Freda:肿么办肿么办T_T?
Rainbow:我们先躲起来观察一下汪星人的动态吧>_<!

【题目描述】

Rainbow和Freda躲到了瞭望塔里,发现汪星人这次的目标有些奇怪。
Rainbow的城堡有N扇门,从1到N标号,它们初始时都是关着的。现在来了N只汪星人,第i只汪星人会把所有标号能被i整除的门的状态改变(即把标号能被i整除的关着的门打开,把标号能被i整除的开着的门关上)。
Rainbow为城堡定义了一个不安全指数——即最后打开着的门的数目。Rainbow想请你帮忙计算,城堡的不安全指数是多少?

【输入格式】

每个测试点包括多组测试数据。
第一行一个整数T,表示一共有T组测试数据。
接下来T行每行一个整数N,表示Rainbow城堡的门的数量。

【输出格式】

输出T行,第i行的数字表示,对于第i个N,城堡的不安全指数。

【样例输入】

4 
4
10
16
27

【样例输出】

2 
3
4
5

【提示】

样例解释:   
当N=4的时候,4扇门情况如下(1表示开,0表示关):
没有汪星人来的时候:0000
第一只汪星人来后:1111
第二只汪星人来后:1010
第三只汪星人来后:1000
第四只汪星人来后:1001
所以答案为2
对于20%的数据,T<=100.
对于100%的数据,T<=20000,N<=50000. 

解题报告:

本题我看到后没什么思路,果断模拟。不过,模拟也需要一个技巧,那就是,第i个人一定只能开关i以后的门。这样,我们就可以开一个记录门开关的数组,将50000个人开关门以后各个门的开关情况记录下来。这样开一个ans数组记录答案。。

代码:

C++语言

made by PaulInsider!
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int q[50005]={0};
bool used[50005]={0};
int n,m;
int main()
{
   freopen ("wang.in","r",stdin);
   freopen ("wang.out","w",stdout);
   for (int i=2;i<=50000;i++)
   {
       for (int j=i;j<=50000;j+=i)
       {
           used[j]=!used[j];
       }
   }
   for (int i=1;i<=50000;i++)
   {
       q[i]=q[i-1]+(!used[i]);
   }
   cin>>n;
   for (int i=0;i<n;i++)
   {
       cin>>m;
       cout<<q[m]<<endl;
   }
   return 0;
}

Views: 575 | Added by: dandan | Tags: NOIP | Rating: 0.0/0
Total comments: 0
Name *:
Email *:
Code *: