有n个数 a[1],a[2],...,a[n]开始都是0
现在进行操作 t从1~n依次增加
每次把下标时t的倍数的数都反转(0变成1,1变成0)
如果最后a[i]为0,那么称此时的i为好数。
现在对于给定的n,求这时候的好数个数。
n<=1e15
Input
一个数n,表示有n个数。(n<=1e15)
Output
一个数,表示好数的个数。
Input示例
2
Output示例
1
思路:虽然简单。。。但我还是打表找规律出的。。。。傻逼了, 对于每个数,其实就看他前面因子的数量,因子是偶数,那就0,奇数就是1, 因子奇数偶数太简单了。。只有完全平方数是奇数,其余全都是偶数, 因为1 对应 x, 2 对应 x/2....只有完全平方数 sqrt == sqrt,,
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 1e4;
int a[maxn];
int main()
{
ll n;
while(cin >> n)
{
// memset(a, 0, sizeof(a));
// for(int i = 1; i <= n; i++)
// for(int j = 1; j <= n; j++)
// {
// if(j%i == 0) a[j] = !a[j];
// }
// for(int i = 1; i <= n; i++)
// {
// if(!a[i])
// printf("%d ", i);
// }
// cout << endl;
ll ans = 0;
ans = sqrt(n);
printf("%lld\n", n-ans);
}
return 0;
}