Switch Game<开灯问题>关于n以内的完全平方数个数求解

Switch Game

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15011    Accepted Submission(s): 9160


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.
 

Author
LL
 

Source

校庆杯Warm Up


其实,开灯这一类的题目我们都已经做了几遍了,最开始用的模拟可以AC,但是今天打月赛的时候做了,理解了一个非常好得方法

解题思路:

考虑哪些位置的a[i]最终为1,最终为1说明此位置被反转了奇数次,即i有奇数个因子,而有且仅有完全平方数有奇数个因子,所以答案为sqrt(n)。

这里解释一下为什么对于n以内的数只含有sqrt(n)个完全平方数

首先,所谓的完全平方数:完全平方即用一个整数乘以自己例如1*1,2*2,3*3等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数

所以我们可以理解,在N以内的最大完全平方因子为sqrt(n),那么,因为所有的数都能生成一个完全平方数,所以从1到sqrt(n)都能生成一个小于等于N的完全平方数,所以我们取N以内的完全平方数个数,只要向下取整求得sqrt(N)即可


#include <iostream>
#include <cstring>
#include <stack>
#include <cstdio>
#include <cmath>
#include <queue>
#include <algorithm>
#include <vector>
#include <set>
#include <map>

const double eps=1e-8;
const double PI=acos(-1.0);
using namespace std;

long long int a[70];

int main()
{
    double n;
    while(~scanf("%lf",&n)){
        printf("%.0f\n",floor(sqrt(n)));
    }
    return 0;
}

/**********************************************************************
	Problem: 1970
	User: 201501080127
	Language: C++
	Result: AC
	Time:128 ms
	Memory:2032 kb
**********************************************************************/


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值