zoukankan      html  css  js  c++  java
  • [bzoj] 2694 Lcm || 莫比乌斯反演

    原题

    定义整数a,b,求所有满足条件的lcm(a,b)的和:
    1<=a<=A
    1<=b<=B
    ∀n>1,n2†gcd(a,b)(即任意n>1,(n^2)不是gcd(a,b)的约数)
    输出答案对2^30取模。


    要求gcd(a,b)不能含平方因子,所以gcd(a,b)一定是mu不等于0的数。
    那么我们设所有满足条件的数为p
    其余与bzoj 2693是一样的,推倒见这里!

    //敲公式累死了……

    #include<cstdio>
    #include<algorithm>
    #define N 4000000
    #define p (1<<30)
    using namespace std;
    int n,m,t,prime[N+10],miu[N+10],sum[N+10];
    bool f[N+10];
    
    void init()
    {
        miu[1]=1;
        for (int i=2;i<=N;i++)
        {
    	if (!f[i])
    	{
    	    prime[++prime[0]]=i;
    	    miu[i]=-1;
    	}
    	for (int j=1;j<=prime[0] && prime[j]*i<=N;j++)
    	{
    	    f[i*prime[j]]=1;
    	    if (i%prime[j]==0)
    	    {
    		miu[i*prime[j]]=0;
    		break;
    	    }
    	    miu[i*prime[j]]=-miu[i];
    	}
        }
        for (int i=1;i<=N;i++)
    	if (miu[i])
    	    for (int j=1;j*i<=N;j++) sum[j*i]+=miu[j]*j*j*i;
        for (int i=1;i<=N;i++) sum[i]+=sum[i-1];
    }
    
    int calc(int x,int y)
    {
        int t1=(x+1)*x/2,t2=(y+1)*y/2;
        return t1*t2;
    }
    
    int main()
    {
        scanf("%d",&t);
        init();
        while (t--)
        {
    	scanf("%d%d",&n,&m);
    	if (n>m) swap(n,m);
    	int ans=0;
    	for (int i=1,last;i<=n;i=last+1)
    	{
    	    last=min(n/(n/i),m/(m/i));
    	    ans=ans+(sum[last]-sum[i-1])*calc(n/i,m/i);
    	}
    	printf("%d
    ",(ans%p+p)%p);
        }
        return 0;
    }
    
  • 相关阅读:
    docker1
    Ubuntu中安装deb包程序
    Linux性能评测工具之一:gprof篇介绍
    Lua在Linux下的安装
    gprof的使用介绍
    Linux性能评测工具之一:gprof篇
    google-perftools 分析JAVA 堆外内存
    NetHogs下载和监控
    Google perf tools for nginx
    ECLIPSE中添加TPTP插件
  • 原文地址:https://www.cnblogs.com/mrha/p/8204931.html
Copyright © 2011-2022 走看看