abc400_C 2^a b^2

C.2a b2

原题链接

Problem Statement

A positive integer X is called a good integer if and only if it satisfies the following condition:

  • There exists a pair of positive integers (a,b) such that X = >2a b2.

For example, 400 is a good integer because 400 = 22 102.

Given a positive integer N, find the number of good integers between 1 and N, inclusive.

Constraints:

  • 1 ≤ N ≤ 1018
  • N is an integer

Sample Input:

400

Sample Output:

24

解题思路:

不难想到,
一种思路是固定2k枚举每个2k·12到2k·x2(x是使2k·x2小于n的最大数),然后从k到k+1,累计每个k下的x求和
另一种思路是固定x2,枚举每个2k·x2到2k+1·x2,然后从x到x+1,统计每个x下的k求和
不难发现第二种思路在时间复杂度O(\(\sqrt{n}\))不允许且重复子区间难以计算,而第一种O(lgn)只需要保证每次仅计算区间中是奇数的x的个数即可
PS:不难发现非重复子区间的个数可以由2k其中k的奇偶性划分,保证奇数与偶数不会重复枚举,那只要直接计算(\(\sqrt{n/4}\)+\(\sqrt{n/2}\))之和即可

AC code1:

void solve(){
    ll n;cin>>n;
    ll ans=0;
    for(int i=1;;i++){
        ll t=(1LL<<i);
        if(t>n) break;
        ll s=sqrtl(n/t);
        ans+=(s+1LL)/2LL;
    }
    cout<<ans<<endl;
}

AC code2:

void solve(){
    ll n;cin>>n;
    cout<<(int)sqrtl(n/4)+(int)sqrtl(n/2)<<endl;
}
posted @ 2025-04-06 11:51  usedchang  阅读(66)  评论(0)    收藏  举报