【容斥O(n)莫比乌斯筛 && 花式开根】Educational Codeforces Round 50 (Rated for Div. 2) F. Relatively Prime Powers

Step1 Problem:

找 2 到 n 中满足条件 x 的个数。
条件:x 唯一分解后质因数的幂的 gcd = 1。
例:10:4, 8, 9 不满足条件,输出 6.
数据范围:
1<=T<=1e5, 2 <= n <= 1e18.

Step2 Ideas:

x^4 * y^2 = (x^2 * y)^2,也就是对幂进行提公因式。
幂提公因式 = 1 的个数就是结果。
枚举:
在范围内:t^1 有 g1 个 t
在范围内:t^2 有 g2 个 t
在范围内:t^3 有 g3 个 t
在范围内:t^4 有 g4 个 t
在范围内:t^5 有 g5 个 t
… … … … … … … … …
结果 += sum{g(i) * mbus(i)}, 1 <= i <= 62.

Step3 Code:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 100;
int prim[N], cnt;
int mbus[N], vis[N];
void get_mbus()
{
    memset(vis, 0, sizeof(vis));
    memset(mbus, 0, sizeof(mbus));
    vis[0] = vis[1] = 1; mbus[1] = 1;
    cnt = 0;
    for(int i = 2; i < N; i++)
    {
        if(!vis[i]) {
            prim[cnt++] = i;
            mbus[i] = -1;//奇数个质因子
        }
        for(int j = 0; i*prim[j] < N && j < cnt; j++)
        {
            vis[i*prim[j]] = 1;
            if(i%prim[j] == 0) {
                mbus[i*prim[j]] = 0;//存在质因子有平方
                break;
            }
            else {
                mbus[i*prim[j]] = -1*mbus[i];//积性函数,质因子多了一个所以乘 -1.
            }
        }
    }
}
//ll gen(ll n, ll k) {
//    ll t = powl(n, 1.0/k);
//    return t+(powl(t+1, k) <= n);
//}
ll gen(ll n, ll k) {
    ll t = powl(n, 1.0/k)-0.5;
    return t+(powl(t+1, k)-0.5 <= n);
}
int main()
{
    get_mbus();
    int T;
    ll n;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%lld", &n);
        ll ans = n-1;
        for(int i = 2; i < 100; i++)
        {
            if(mbus[i] == 0) continue;
            ll x = gen(n, i);
            if(x == 1) break;
            ans += mbus[i] * (x-1);
        }
        printf("%lld\n", ans);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值