Bzoj P2440 [中山市选2011]完全平方数___莫比乌斯函数

题目大意:

小 X讨厌所有是完全平方数的正整数倍的数。
问第 K K K个小X不讨厌的数是多少。
询问有 Q Q Q

1 ≤ K ≤ 1 0 9 1 ≤ K ≤ 10^9 1K109
Q ≤ 50 Q ≤ 50 Q50

分析:

容斥一下可以发现
A n s w e r = Σ μ [ i ] ∗ ( n / i 2 ) Answer=Σμ[i]*(n/i^2) Answer=Σμ[i](n/i2)

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <cstring>
#include <algorithm>
 
#define N 50005
 
using namespace std;
 
typedef long long ll;
 
int prime[N], check[N], mu[N], T, n, cnt;
 
void Pre_Work()
{
    mu[1] = 1; 
    for (int i = 2; i <= 50000; i++)
    {
        if (!check[i])
            prime[++cnt] = i, mu[i] = -1;
             
        for (int j = 1; j <= cnt; j++)
        {
            if (i * prime[j] > 50000) break;
            check[i * prime[j]] = 1;
            if (i % prime[j] == 0) { mu[i * prime[j]] = 0; break; }
            mu[i * prime[j]] =  -mu[i];
        } 
    }
}
 
 
ll Get_yzh(ll x)
{
    ll Number = 0;
    for (ll i = 1; i * i <= x; i++) Number = Number + mu[i] * (x / (i * i));
    return Number;
}
 
void Get_Answer(int x)
{
    ll l = 0, r = 0x7fffffff, Answer = 0;
    while (l <= r)
    {
        ll mid = (l + r) >> 1;
        if (Get_yzh(mid) >= x) Answer = mid, r = mid - 1;
           else l = mid + 1;
    }
    printf("%lld\n", Answer);
}
 
int main()
{
    Pre_Work();
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d", &n);
        Get_Answer(n);
    }
    return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值