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

Posted zquzjx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
",ans);
    }

    return 0;
}
View Code

 

以上是关于hdu6390 /// 欧拉函数+莫比乌斯反演 筛inv[] phi[] mu[]的主要内容,如果未能解决你的问题,请参考以下文章

HDU 6390 GuGuFishtion(莫比乌斯反演 + 欧拉函数性质 + 积性函数)题解

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

数论入门——莫比乌斯函数,欧拉函数,狄利克雷卷积,线性筛,莫比乌斯反演,杜教筛

hdu1695 GCD(莫比乌斯反演)

欧拉筛线性处理莫比乌斯函数

luogu2658 GCD(莫比乌斯反演/欧拉函数)