UESTC 618 无平方因子数 (容斥 + 莫比乌斯反演)

无平方因子数

Time Limit: 4000/2000MS (Java/Others)

Memory Limit: 65535/65535KB (Java/Others)

Submit  Status

无平方因子数即对于任意一个素数p,p2都不会整除那个数,如1 , 5=5 , 15=3×5都是无平方因子数,而20=22×5不是。现在给定一个n (1≤n<1012) ,求区间[1,n]中无平方因子数的个数。

Input

第一行有个整数T,代表数据组数(T≤10)

接下来有T行,每行有个整数n (1≤n<1012)

Output

输出T行,每行输出一个整数代表区间[1,n]内的无平方因子数的个数。

Sample Input

3

1

10

30

Sample Output

1

7

19

Source

UESTC Training for Math

题目链接:http://acm.uestc.edu.cn/#/problem/show/618

题目分析:又是无平方因子数,比BZOJ那题简单很多,直接算就行了,参照BZOJ 2440

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
int const MAX = 1e6 + 5;
int mob[MAX], p[MAX];
bool prime[MAX];

void Mobius()
{
    int pnum = 0;
    memset(prime, true, sizeof(prime));
    mob[1] = 1;
    for(int i = 2; i < MAX; i++)
    {
        if(prime[i])
        {
            p[pnum ++] = i;
            mob[i] = -1;
        }
        for(int j = 0; j < pnum && i * p[j] < MAX; j++)
        {
            prime[i * p[j]] = false;
            if(i % p[j] == 0)
            {
                mob[i * p[j]] = 0;
                break;
            }
            mob[i * p[j]] = -mob[i];
        }
    }
}

ll cal(ll n)
{
    ll cnt = 0;
    for(ll i = 1; i * i <= n; i++)
        cnt += (ll) mob[i] * (n / (i * i));
    return cnt;
}

int main()
{
    Mobius();
    int T;
    scanf("%d", &T);
    while(T --)
    {
        ll n;
        scanf("%lld", &n);
        printf("%lld\n", cal(n));
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 11:18:35

UESTC 618 无平方因子数 (容斥 + 莫比乌斯反演)的相关文章

【二分+容斥+莫比乌斯反演】BZOJ2440 完全平方数

Description 求第k个没有完全平方因子的数,k<=1e9. Solution 这其实就是要求第k个µ[i](莫比乌斯函数)不为0的数. 然而k太大数组开不下来是吧,于是这么处理. 二分答案x,问题转化为求[1,x]间有多少个没有完全平方因子的数. 容斥,加上全部,减去一个质数的平方的倍数个数,加上两个质数乘积的平方的倍数个数... 然后发现,每个数的系数就是µ 这也说明了莫比乌斯的原理就是容斥,µ函数就是容斥系数 具体来说,对于每一个i<=sqrt(x),对于ans的贡献就是µ[i]

cf900D. Unusual Sequences(容斥 莫比乌斯反演)

题意 题目链接 Sol 首先若y % x不为0则答案为0 否则,问题可以转化为,有多少个数列满足和为y/x,且整个序列的gcd=1 考虑容斥,设\(g[i]\)表示满足和为\(i\)的序列的方案数,显然\(g[i] = 2^{i-1}\)(插板后每空位放不放) 同时还可以枚举一下gcd,设\(f[i]\)表示满足和为\(i\)且所有数的gcd为1的方案,\(g[i] = \sum_{d | i} f[\frac{n}{d}]\) 反演一下,\(f[i] = \sum_{d | i} \mu(d)

无平方因子数的分布 (Ⅰ)

无平方因子数的分布(Ⅰ) Daoyi Peng May 23, 2015 ● 卷积方法余项估计 定义 1   乘性函数 $n\mapsto \mu^2(n)$, 其部分和 \begin{equation*}  Q(x):=\sum_{n\leqslant x}\mu^2(n)\end{equation*} 等于不超过 $x$ 的无平方因子整数的个数. 定理 1   当 $x$ 趋于无穷时, 有 \begin{equation*}  Q(x)=\frac{6}{\pi^2}x+O(\sqrt{x}

bzoj 4671 异或图 —— 容斥+斯特林反演+线性基

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4671 首先,考虑容斥,就是设 \( t[i] \) 表示至少有 \( i \) 个连通块的方案数: 我们希望得到恰好有一个连通块的方案数,但这里不能直接 \( + t[1] - t[2] + t[3] - t[4] ... \),因为每个"恰好 \( i \) 个连通块"的情况并不是在各种 \( t[j] ( j<=i ) \) 中只被算了一次,而是因为标号,被算了 \(

【bzoj4671】异或图(容斥+斯特林反演+线性基)

传送门 题意: 给出\(s,s\leq 60\)张图,每张图都有\(n,n\leq 10\)个点. 现在问有多少个图的子集,满足这些图的边"异或"起来后,这张图为连通图. 思路: 直接考虑判断图的连通不好判断,所以考虑枚举连通块来进行容斥. 定义\(f_i\)表示有\(i\)个连通块的答案,发现连通块这个东西也不好处理,我们只能处理出有多少个连通块,但无法确定每个连通块内部的连通关系. 定义\(g_i\)为至少有\(i\)个连通块的方案数,那么就有关系式:\(\displaystyle

BZOJ 2440 完全平方数 (容斥+莫比乌斯反演+二分)

2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1673  Solved: 799 [Submit][Status][Discuss] Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送一 个

数轮初步---无平方因子的数

这是从刘汝佳的算法竞赛入门经典中看到的题,书中是这么描述的 给出正整数n和m,输出在[m, n]中的无平方因子数.PS(无平方因子数的概念请自行百度) #include<stdio.h> #include<string.h> #include<math.h> bool visited[10000005]; int prime[500000]; int main(){ int n, m; scanf("%d", &n, &m); int

shu_1746 无平方因子

http://202.121.199.212/JudgeOnline/problem.php?id=1746 analy: 无平方因子数,那就是不同的素因子个数一定不超过1,于是就朝这个方向努力: 先把2-10^9之间的所有素数求出来(也就是到99999989之间的所有素数用bool表打出来) 然后一个一个素因子判断过去: 再然后果断TLE了n次: 于是,观察了一下其他人的提交记录,发现代码很短,不可能打表:时间也很短,有很好的算法? 试后,找了一下无平方因子的相关资料,没发现很好的算法: 于是

BZOJ2440(全然平方数)二分+莫比乌斯容斥

题意:全然平方数是指含有平方数因子的数.求第ki个非全然平方数. 解法:比較明显的二分,getsum(int middle)求1-middle有多少个非全然平方数,然后二分.求1-middle的非全然平方数个数能够用总数减掉全然平方数个数.计算全然平方数的个数用容斥: 首先加上n/(2*2)+n/(3*3)+n/(5*5)+n/(7*7)...+...然后减掉出现两次的,然后加上三次的...奇加偶减.这就是mou的原型,用mou数组计算非常easy: 代码: /*****************