题目
有n个数 a[1],a[2],…,a[n]开始都是0
现在进行操作 t从1~n依次增加
每次把下标时t的倍数的数都反转(0变成1,1变成0)
如果最后a[i]为0,那么称此时的i为好数。
现在对于给定的n,求这时候的好数个数。
n<=1e15
解析
要使一个数最后为1,则他的因数个数必定为奇数,一个数因子个数为奇数,则代表,他为一个数的平方,
所以最终为0的数为n-sqrt(n)
具体代码如下
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int N=1e5+10;
/*
要使一个数最后为1,则他的因数个数为奇数,一个数因子个数为奇数,则代表,他为一个数的平方,
所以最终为0的数为n-sqrt(n)
*/
int main()
{
ll n;
cin>>n;
int q=sqrt(n);
cout<<n-q<<endl;
return 0;
}