hdu6390 /// 欧拉函数+莫比乌斯反演 筛inv[] phi[] mu[]

题目大意:

给定m n p 求下式

 

题解:https://blog.csdn.net/codeswarrior/article/details/81700226

莫比乌斯讲解:https://www.cnblogs.com/peng-ym/p/8647856.html

莫比乌斯的mu[]:https://www.cnblogs.com/cjyyb/p/7953803.html

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
const int N=1e6+5;

LL mu[N], phi[N];
LL inv[N];

int n,m,p;

void initinv() {
    inv[1]=1;
    for(int i=2;i<N;i++)
        inv[i]=inv[p%i]*(LL)(p-p/i)%p;
} // 逆元
void init() {
    for(int i=1;i<N;i++) phi[i]=i;
    for(int i=2;i<N;i++)
        if(i==phi[i]) {
            for(int j=i;j<N;j+=i)
                phi[j]=phi[j]/i*(i-1);
        }
    mem(mu,0); mu[1]=1;
    for(int i=1;i<N;i++)
        for(int j=i*2;j<N;j+=i)
            mu[j]-=mu[i];
} // 欧拉 莫比乌斯

LL moblus(int a,int b,int g) {
    LL res=0; a/=g,b/=g;
    /// gcd(1~a,1~b)=g -> gcd(1~a/g,1~b/g)=1
    for(int i=1;i<=min(a,b);i++)
        res+=(LL)mu[i]*(a/i)*(b/i);
    /// mu[i] * (1~a,1~b)中[gcd=g或g的倍数]的数量
    return res;
}

int main()
{
    init();
    int t; scanf("%d",&t);
    while(t--) {
        scanf("%d%d%d",&m,&n,&p);
        LL ans=0; initinv();
        for(int i=1;i<=min(m,n);i++) {
            LL uF=moblus(n,m,i)%p;
            ans=(ans+uF*i%p*inv[phi[i]]%p)%p;
        }
        printf("%lld\n",ans);
    }

    return 0;
}

原文地址:https://www.cnblogs.com/zquzjx/p/10383613.html

时间: 2024-09-30 02:47:24

hdu6390 /// 欧拉函数+莫比乌斯反演 筛inv[] phi[] mu[]的相关文章

E - GuGuFishtion HDU - 6390(欧拉函数 / 莫比乌斯反演)

GuGuFishtion (HDU - 6390) 题意: 定义\(G_u (a,b)=\frac{\phi(ab)}{\phi(a)\phi(b)}\). 求\((\sum\limits_{a=1}^m\sum\limits_{b=1}^nG_u (a,b))\pmod p\). 题解: 考虑\(\phi(x) = x*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})...*(1-\frac{1}{p_n})\). 将\(G_u (a,b)\)的分子与分母按上述分解.约分

莫比乌斯反演欧拉函数杜教筛大总结

莫比乌斯函数 定义 设\(n=\prod_{i=1}^{k} p_i^{c_i}\),则\(\mu(n)=(-1)^k\),特别地\(\mu(1)=1\). 性质 最常用性质 \(\sum_{d|n}\mu(d)=[n=1]\) 反演性质 \(F(n)=\sum_{d|n}f(d) \Longleftrightarrow f(n)=\sum_{d|n}F(d)\mu(\frac{n}{d})\) \(F(n)=\sum_{n|d}f(d) \Longleftrightarrow f(n)=\su

【模版】线性筛(素数,欧拉函数,莫比乌斯函数)

线性筛: 线性筛是一种比较实用的筛法,它与数论中的(完全)积性函数密切相关: (完全)积性函数的定义:对于两个整数 \(x_1\) 和 \(x_2\) ,若有函数\(f(x)\)满足:\(f(x_1x_2)=f(x_1)f(x_2)\),我们称\(f(x)\)为完全积性函数:特殊的:若 \(x_1\) 和 \(x_2\) 一定为两个互质的正整数,我们称\(f(x)\)为积性函数! 而线性筛就是利用了这一性质,将\(f(x)\)用且只用\(x\)最小的那个质因子利用\(f(x_1x_2)=f(x_

[BZOJ2818] Gcd (数论,欧拉函数,线性筛)

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 必须用线性筛. 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int maxn = 10001001; 5 LL phi[maxn], sum[maxn], n; 6 bool isprime[maxn]; 7 LL prime[maxn]; 8 int tot;

[数论]欧拉函数&素数筛

一.欧拉函数 欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示. 通式: 其中p1, p2--pn为x的所有质因数,x是不为0的整数. 比如x=12,拆成质因数为12=2*2*3, 12以内有1/2的数是2的倍数,那么有1-1/2的数不是2的倍数(1,3,5,7,9,11), 这6个数里又有1/3的数是3的倍数, 只剩下(1 - 1/2 - 1/3)的数既不是2的倍数,也不是3的倍数(1,5,7,11). 这样剩下的12*(1 - 1/2 - 1/3)=4,即4个数与12互质,所以

BZOJ2818 GCD 【欧拉函数,线性筛】

题目大意: 给一个范围[1,n],从中找出两个数x,y,使得gcd(x,y)为质数,问有多少对(x,y有序) 解法: 不难,欧拉函数练手题,可以定义集合P ={x|x为素数},那么我们枚举gcd(x,y)可能等于的情况,对于任意p∈P可以得到:gcd(k1·p,k2·p) = p,当且仅当gcd(k1,k2) =1;那么我们就只需要枚举所有的k1,k2了.不妨设k1>k2,那么给定k1,k2的个数就是phi(k1),因为有序,所以给phi*2,但是,这样是否漏算了呢?没错,漏算了(1,1),补上

【BZOJ】2818: Gcd(欧拉函数/莫比乌斯)

http://www.lydsy.com/JudgeOnline/problem.php?id=2818 我很sb的丢了原来做的一题上去.. 其实这题可以更简单.. 设 $$f[i]=1+2 \times \phi (i) $$ 那么答案就是 $$\sum_{p是质数} f[n/p]$$ 就丢原来的题了...不写了.. #include <cstdio> #include <cstring> #include <cmath> #include <string>

hdu 6390 欧拉函数+容斥(莫比乌斯函数) GuGuFishtion

http://acm.hdu.edu.cn/showproblem.php?pid=6390 题意:求一个式子 题解:看题解,写代码 第一行就看不出来,后面的sigma公式也不会化简.mobius也不会 就自己写了个容斥搞一下(才能维持现在的生活) //别人的题解https://blog.csdn.net/luyehao1/article/details/81672837 #include <iostream> #include <cstdio> #include <cstr

线性(欧拉)筛&amp;欧拉函数

线性筛法 what is 线性筛??就是基于最基本的筛法的优化. 在基础的筛法上,我们发现有的数字会被重复筛,例如6既会被2枚举到也会被3枚举到,必然有重复运算. 我们的做法就是让每一个数的最小因数筛. \(FOR\) \(EXAMPLE:\) 有一个数\(2 * 2 * 3 * 5\) 有另一个数 \(3 * 3 * 3* 5\) 那么第一个数枚举到3的话,筛到的数字是\(2 * 2 * 3 * 3 * 5\) 但是在第二个数字再次枚举的时候 枚举到2时 也会枚举到\(2 * 2 * 3 *