千家信息网

java怎么解决欧拉函数和莫比乌斯反演问题

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,本文小编为大家详细介绍"java怎么解决欧拉函数和莫比乌斯反演问题",内容详细,步骤清晰,细节处理妥当,希望这篇"java怎么解决欧拉函数和莫比乌斯反演问题"文章能帮助大家解决疑惑,下面跟着小编的思路
千家信息网最后更新 2025年01月20日java怎么解决欧拉函数和莫比乌斯反演问题

本文小编为大家详细介绍"java怎么解决欧拉函数和莫比乌斯反演问题",内容详细,步骤清晰,细节处理妥当,希望这篇"java怎么解决欧拉函数和莫比乌斯反演问题"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

题意:给定a,b,c,d,k

x属于[1 , c],y属于[1 , d],求满足gcd(x,y)=k的对数。其中算相同。

解法一:不妨设c

那么假如y<=c/k,那么对数就是y从1到c/k欧拉函数的和。如果y>c/k,就只能从[ c/k+1 , d ]枚举,然后利用容斥。详见代码:

/*********************************************************  file name: hdu1695.cpp  author : kereo  create time:  2015年02月11日 星期三 18时08分43秒*********************************************************/#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int sigma_size=26;const int N=100+50;const int MAXN=100000+50;const int inf=0x3fffffff;const double eps=1e-8;const int mod=1000000000+7;#define L(x) (x<<1)#define R(x) (x<<1|1)#define PII pair#define mk(x,y) make_pair((x),(y))int primecnt,factcnt;int prime[MAXN],euler[MAXN],factor[N][2];void getprime(){    primecnt=0;    memset(prime,0,sizeof(prime));    for(int i=2;ib || k>d){            printf("0\n");            continue;        }        if(b>d)            swap(b,d);        b/=k; d/=k;        ll ans=0;        for(int i=1;i<=b;i++)            ans+=euler[i];        for(int i=b+1;i<=d;i++)            ans+=solve(b,i);        printf("%I64d\n",ans);    }        return 0;}

解法二:莫比乌斯反演。

其中"设F(a,b,k)表示有多少组x≤a,y≤b,且Gcd(a,b)≥k"的"Gcd(a,b)>=k"应该是k | Gcd(x,y)。


/*********************************************************  file name: hdu1695.cpp  author : kereo  create time:  2015年02月12日 星期四 09时08分41秒*********************************************************/#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int sigma_size=26;const int N=100+50;const int MAXN=100000+50;const int inf=0x3fffffff;const double eps=1e-8;const int mod=1000000000+7;#define L(x) (x<<1)#define R(x) (x<<1|1)#define PII pair#define mk(x,y) make_pair((x),(y))int primecnt;int vis[MAXN],mu[MAXN],prime[MAXN],sum[MAXN];void Mobius(){    primecnt=0;    memset(vis,0,sizeof(vis));    mu[1]=1;    for(int i=2;ir)        swap(l,r);    int last;    for(int i=1;i<=l;i=last+1){        last=min(l/(l/i),r/(r/i));        ans+=(ll)(sum[last]-sum[i-1])*(ll)(l/i)*(ll)(r/i);    }    return ans;}int main(){    int T,kase=0;    Mobius();    sum[0]=0;    for(int i=1;ib || k>d){            printf("0\n");            continue;        }        if(b>d)            swap(b,d);        b/=k; d/=k;        printf("%I64d\n",solve(b,d)-solve(b,b)/2);    }        return 0;}

读到这里,这篇"java怎么解决欧拉函数和莫比乌斯反演问题"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

0