zoukankan      html  css  js  c++  java
  • 【BZOJ】2820: YY的GCD(莫比乌斯)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2820

    此题非常神!

    下文中均默认n<m

    首先根据bzoj1101的推理,我们易得对于一个数d使得数对(x,y)=k的个数为:

    $$sum_{1<=d<=n'} mu (d) imes lfloor frac{n'}{d} floor imes lfloor frac{m'}{d} floor, 其中n'=lfloor frac{n}{k} floor, m'=lfloor frac{m}{k} floor$$

    所以本题很容易得到

    $$sum_{p是质数}^{n} sum_{1<=d<=n/p} mu (d) imes lfloor frac{n/p}{d} floor imes lfloor frac{m/p}{d} floor$$

    因为整除取下界可以有结合律(有待证明,upd:因为$lfloor frac{lfloor frac{a}{b} floor}{c} floor = lfloor frac{a}{bc} floor$,这种sb东西还用说?随便一本数论书上面都有吧),所以设$T=pd$,那么问题可以转换为:

    $$sum_{p是质数}^{n} sum_{1<=d<=n/p} mu (d) imes lfloor frac{n}{T} floor imes lfloor frac{m}{T} floor$$

    将问题转换为枚举T(考虑$T=1$的情况也无妨,因为最终不会计入),得:

    $$sum_{T=1}^{n} sum_{egin{subarray}{c} p le n \ 且p|T \ 且 p是质数 end{subarray}} mu (frac{T}{p}) imes lfloor frac{n}{T} floor imes lfloor frac{m}{T}  floor$$

    化简得

    $$sum_{T=1}^{n} lfloor frac{n}{T} floor imes lfloor frac{m}{T}  floor sum_{egin{subarray}{c} p le n \ 且p|T \ 且 p是质数 end{subarray}} mu (frac{T}{p})$$

    设$$g[x]=sum_{ egin{subarray}{c} p le n \ 且p|x \ 且 p是质数 end{subarray} } mu (frac{x}{p})$$

    那么原式变成

    $$sum_{T=1}^{n} lfloor frac{n}{T} floor imes lfloor frac{m}{T}  floor imes g[T]$$

    真漂亮的公式!

    那么我们只需要考虑如何计算g[x]即可!

    我们发现$g[x]$似乎可以在线性筛的时候预处理出?$x=k imes p, p为质数$的情况,可得:

    $$ g[kp]=
    egin{cases}
    mu (k) & 当p|k时 \
    mu (k) - g[k] & 当p mid k时\
    end{cases}
    $$

    首先根据定义,此时

    $$g[kp]=sum_{egin{subarray}{c} p' le n \ 且p'|kp \ 且 p'是质数 end{subarray}} mu (frac{kp}{p'})$$

    为什么呢?

    首先考虑$p|k$时,有$kp$质因子$p$的指数>=2

    1、当$p'=p$,那么约掉后还剩下$mu (k)$

    2、当$p' eq p$,那么$p$的质数>=2,根据莫比乌斯函数的定义,为0

    因此$式1+式2=mu (k)$

    考虑$p mid k$时,有$kp$质因子$p$的指数=1

    1、当$p'=p$,那么约掉后同样是$mu (k)$

    2、当$p' eq p$,那么因为$mu$是积性函数,且$p与frac{k}{p'}$互质,那么得到$mu(p) mu left( frac{k}{p'} ight)$,然后提出和式。因为$mu(p)=-1$,而和式内的和恰好就是$g[k]$的定义,因此这种情况的个数为$-g[k]$

    因此$式1+式2=-g[k]$

    然后和1101一样的做法了,分块然后乘起来。。

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <set>
    #include <map>
    using namespace std;
    typedef long long ll;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define read(a) a=getint()
    #define print(a) printf("%d", a)
    #define dbg(x) cout << (#x) << " = " << (x) << endl
    #define error(x) (!(x)?puts("error"):0)
    inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
    #define rdm(x, i) for(int i=ihead[x]; i; i=e[i].next)
    
    const int N=10000005;
    int p[N], cnt, np[N], mu[N], g[N], sum[N];
    void init() {
    	mu[1]=1;
    	for2(i, 2, N) {
    		if(!np[i]) p[++cnt]=i, mu[i]=-1, g[i]=1;
    		for1(j, 1, cnt) {
    			int t=p[j]*i; if(t>=N) break;
    			np[t]=1;
    			if(i%p[j]==0) { mu[t]=0; g[t]=mu[i]; break; }
    			mu[t]=-mu[i]; g[t]=mu[i]-g[i];
    		}
    	}
    	for2(i, 1, N) sum[i]=sum[i-1]+g[i];
    }
    
    int main() {
    	int t=getint(); init();
    	while(t--) {
    		int n=getint(), m=getint();
    		ll ans=0; if(n>m) swap(n, m);
    		int pos;
    		for(int i=1; i<=n; i=pos+1) {
    			pos=min(n/(n/i), m/(m/i));
    			ans+=(ll)(sum[pos]-sum[i-1])*(n/i)*(m/i);
    		}
    		printf("%lld
    ", ans);
    	}
    	return 0;
    }
    

      


    Description

    神犇YY虐完数论后给傻×kAc出了一题
    给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对
    kAc这种傻×必然不会了,于是向你来请教……
    多组输入

    Input

    第一行一个整数T 表述数据组数
    接下来T行,每行两个正整数,表示N, M

    Output

    T行,每行一个整数表示第i组数据的结果

    Sample Input

    2
    10 10
    100 100

    Sample Output

    30
    2791

    HINT

    T = 10000

    N, M <= 10000000

    Source

  • 相关阅读:
    2014 ACM-ICPC Beijing Invitational Programming Contest
    面试算法爱好者书籍/OJ推荐
    最新版本号MYSQL官网下载地址可是必需要注冊后才干下载
    [ZJOI2019]开关
    2019-9-24-dotnet-remoting-使用事件
    2019-9-24-dotnet-remoting-使用事件
    2019-3-8-为何使用-DirectComposition
    2019-3-8-为何使用-DirectComposition
    2019-8-31-C#-获取-PC-序列号
    2019-8-31-C#-获取-PC-序列号
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/4132095.html
Copyright © 2011-2022 走看看