牛客 124D--有趣的数字

链接: https://www.nowcoder.com/acm/contest/124/D来源:牛客网 题目描述 最近TreeDream沉迷于数字游戏中,发
链接: https://www.nowcoder.com/acm/contest/124/D
来源:牛客网

题目描述

最近TreeDream沉迷于数字游戏中,发现了一种有趣的数字,有趣的数字定义如下:

给定一组n个数,a[1],a[2],a[3],...,a[n], 初始全为0,现在,在这组数上进行x操作;

x 操作定义如下:

x从1~n依次增加,每次把x的下标的倍数的数进行反转,0变成1,1变成0,操作完后,如果a[i]为0,那么i则是有趣的数。

现在对于给定的n(n<=1e15),求这时候有趣的数的个数。

例如:

n = 3

x = 1 时 :a[1] = 1, a[2] = 1, a[3] = 1;

x = 2 时 :a[1] = 1, a[2] = 0, a[3] = 1;

x = 3 时 :a[1] = 1, a[2] = 0, a[3] = 0;
此时,3个数中,有两个数为0,故有趣的数的个数为2;

输入描述:

多组样例,每个样例占一行,每一行输入一个数n,表示有n个数。(n<=1e15)

输出描述:

每个样例输出一行,一行输出一个数,表示有趣的数的个数。

示例1

输入

 

3

输出

 

2


思路:这个跟以前做过的一个灯的题一样,忘记以前是怎么做的了,但是这次发现了新的方法,就是一个sqrt、可以说是很6 了!!!

代码:

#include
using namespace std;
#define inf 0x3f3f3f3f
#define mod 1000000007
long long T,n,num,p,k,a[100005],x,ans;
int main()
{while(~scanf("%lld",&n)){cout<