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
#include
using 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)。

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

/*********************************************************
  file name: hdu1695.cpp
  author : kereo
  create time:  2015年02月12日 星期四 09时08分41秒
*********************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using 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怎么解决欧拉函数和莫比乌斯反演问题”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注创新互联行业资讯频道。


分享题目:java怎么解决欧拉函数和莫比乌斯反演问题
URL网址:http://pwwzsj.com/article/gohcop.html