bzoj 1101 莫比乌斯反演

最裸的莫比乌斯

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int, int>

using namespace std;

const int N = 1e5 + 7;
const int M = 1e6 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 +7;

int p[N], is[N], mbs[N], sum[N], n, m, d, ans, tot;

void init(){
    memset(is, 1 ,sizeof(is));
    mbs[1]=1;
    for(int i = 2; i < N; i++) {
        if(is[i]){
            p[++tot] = i;
            mbs[i] = -1;
        }
        for(int j = 1; j <= tot && p[j] * i < N; j++){
            is[i * p[j]] = 0;
            if(i % p[j] == 0){
                mbs[i * p[j]] = 0;
                break;
            } else {
                mbs[i * p[j]] = -mbs[i];
            }
        }
    }
    for(int i = 1; i < N; i++) {
        sum[i] = mbs[i] + sum[i - 1]; //维护前缀和
    }
}

int cal(int n, int m){  //求[1,n][1,m]区间内互质的(x, y)的对数
    int ans=0;
    if(n > m) swap(n, m);
    for(int L = 1, R=0; L <= n; L = R + 1) {
        R = min(n / (n / L), m /(m / L));     // 分段加速
        ans += (sum[R] - sum[L - 1]) * (n / L) * (m / L);
    }
    return ans;
}

int main(){
    init();
    int T; scanf("%d", &T);
    while(T--) {
        scanf("%d%d%d",&n,&m,&d);
        ans = cal(n / d, m / d);
        printf("%d\n", ans);
    }
    return 0;
}
/*
*/

原文地址:https://www.cnblogs.com/CJLHY/p/9201744.html

时间: 2024-10-23 18:31:31

bzoj 1101 莫比乌斯反演的相关文章

bzoj 2301 莫比乌斯反演

求$(i,j)=k$的一系列模板题之一. 但是这里i,j是有下界的,注意用容斥去掉重复组,其他都一样了. /** @Date : 2017-09-09 19:21:18 * @FileName: bzoj 2301 莫比乌斯反演 多组 范围内 GCD=k.cpp * @Platform: Windows * @Author : Lweleth ([email protected]) * @Link : https://github.com/ * @Version : $Id$ */ #inclu

BZOJ 2301 莫比乌斯反演入门

2301: [HAOI2011]Problem b Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数n,接下来n行每行五个整数,分别表示a.b.c.d.k Output 共n行,每行一个整数表示满足要求的数对(x,y)的个数 Sample Input 2 2 5 1 5 1 1 5 1 5 2 Sample Output 14 3此题作为我的莫比

bzoj 2154 莫比乌斯反演求lcm的和

题目大意: 表格中每一个位置(i,j)填的值是lcm(i,j) , 求n*m的表格值有多大 论文贾志鹏线性筛中过程讲的很好 最后的逆元我利用的是欧拉定理求解的 我这个最后线性扫了一遍,勉强过了,效率不是很高... 1 /*bzoj 2154*/ 2 #include <bits/stdc++.h> 3 4 using namespace std; 5 #define ll long long 6 #define N 10000000 7 const int MOD = 20101009; 8

BZOJ 3561 莫比乌斯反演

$\Sigma_{i=1}^n\Sigma_{j=1}^mlcm(i,j)^{gcd(i,j)}$ $=\Sigma_{i=1}^n\Sigma_{j=1}^m (\frac{i*j}{gcd(i,j)})^{gcd(i,j)}$ 枚举gcd(i,j)=d $=\Sigma_{d=1}^n\Sigma_{i=1}^{\lfloor \frac{n}{d}\rfloor}\Sigma_{j=1}^{\lfloor \frac{m}{d}\rfloor}(d*i*j)^d*(gcd(i,j)==1)

BZOJ 2820 莫比乌斯反演

思路: $\Sigma_{i=1}^n\Sigma_{j=1}^mgcd(i,j)==p(p是素数)$ $\Sigma_{p是素数}^{p<=n}\Sigma_{i=1}^{\lfloor \frac{n}{p} \rfloor}\Sigma_{j=1}^{\lfloor \frac{m}{p} \rfloor}gcd(i,j)==1$ 由$e=μ|1$可得$gcd(i,j)==1 等价于 \Sigma_{d|gcd(i,j)} μ(d)$ 所以原式为 $\Sigma_{p是素数}^{p<=n

BZOJ - 2818 莫比乌斯反演 初步

要使用分块的技巧 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<string> #include<vector> #include<stack> #include<queue> #include<

bzoj 2820 / SPOJ PGCD 莫比乌斯反演

那啥bzoj2818也是一样的,突然想起来好像拿来当周赛的练习题过,用欧拉函数写掉的. 求$(i,j)=prime$对数 \begin{eqnarray*}\sum_{i=1}^{n}\sum_{j=1}^{m}[(i,j)=p]&=&\sum_{p=2}^{min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}[i⊥j]\newline&=&\sum_{p=

bzoj 1101 [POI2007]Zap - 莫比乌斯反演

Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a ,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到你的帮助. Input 第一行包含一个正整数n,表示一共有n组询问.(1<=n<= 50000)接下来n行,每行表示一个询问,每行三个 正整数,分别为a,b,d.(1<=d<=a,b<=50000) Output 对于每组询问,输出到输出文件zap.out一个正

bzoj 1101 Zap —— 莫比乌斯反演

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1101 直接莫比乌斯反演. 代码如下: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; int const xn=5e5+5; int pri[xn],cnt,mu[xn]; bool vis[xn]; int rd()