基准时间限制:
1
秒 空间限制:
131072
KB 分值:
40
难度:4级算法题
有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
打表列举得
1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1
1 0 1 0 1 0 1 0 1
1 0 0 0 1 1 1 0 0
1 0 0 1 1 1 1 0 0
1 0 0 1 0 1 1 1 0
1 0 0 1 0 0 1 1 0
1 0 0 1 0 0 0 1 0
1 0 0 1 0 0 0 0 1
由图可知 红色每一排分别为n=1到n时所取得区域 呈阶梯状向下蔓延 并逐渐趋于稳定
稳定后固定为1的部分分别为1*1 2*2 3*3等等 所以要取得0的个数为n-(小于n的完全平方数的个数)
#include<stdio.h> #include<string.h> #include <iostream> #include <math.h> int main() { long long int n; while(~scanf("%lld",&n)) { long long int q=0; for(long long int i=1;i*i<=n;i++) { q++; } printf("%lld\n",n-q); } }