zoukankan      html  css  js  c++  java
  • P3327 [SDOI2015]约数个数和(莫比乌斯反演)

    题目描述:

    (d(x))(x)的约数个数,给定(n,m),求(sum_{i=1}^nsum_{j=1}^md(ij))

    首先有一个前置知识:

    (d(ij)=sum_{x|i}sum_{y|j}[gcd(x,y)=1])

    所以原式等于:

    (sum_{i=1}^nsum_{j=1}^msum_{x|i}sum_{y|j}[gcd(x,y)=1])

    反演以下:

    (sum_{i=1}^nsum_{j=1}^msum_{x|i}sum_{y|j}sum_{d|gcd(x,y)}mu(d))

    交换求和顺序:

    (sum_{d=1}^nmu(d)sum_{x=1}^nsum_{y=1}^m[d|gcd(x,y)][n/x][m/y])

    然后可以把枚举(x,y)改为枚举(d)的倍数,把([d|gcd(x,y)])这个玩意去掉:

    (sum_{d=1}^nmu(d)sum_{x=1}^{n/d}sum_{y=1}^{m/d}[n/dx][m/dy])

    把与x有关的项,与y有关的项合并,有

    (sum_{d=1}^nmu(d)sum_{x=1}^{n/d}[n/dx]sum_{y=1}^{m/d}[m/dy])

    然后套莫反笔记的引理1:

    (sum_{d=1}^nmu(d)sum_{x=1}^{n/d}[[n/d]/x]sum_{y=1}^{m/d}[[m/d]/y])

    这里我们设(p=n/d,q=m/d)

    (sum_{d=1}^nmu(d)sum_{x=1}^p[p/x]sum_{y=1}^q[q/y])

    (f(x)=sum_{i=1}^x[x/i])

    (sum_{d=1}^nmu(d)f(p)f(q))

    这里(p=[n/d])(q=[m/d]),所以可以对(d)进行数论分块,同一个块内的(p)(q)可以快速计算。

    现在预处理求(f(x))。暴力时间复杂度是(O(n^2))的。

    观察(f(x)=sum_{i=1}^x[x/i]),同一块内(x/i)的值不变,所以对每个(x)可以数论分块求。

    时间复杂度(O(nsqrt{n}+Tsqrt{n}))

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+100;
    typedef long long ll;
    int vis[maxn],pri[maxn],mu[maxn],sum[maxn],cnt;
    ll f[maxn];
    void getMu (int n) {
    	mu[1]=1;
    	for (int i=2;i<=n;i++) {
    		if (!vis[i]) {
    			mu[i]=-1;
    			pri[++cnt]=i;
    		}
    		for (int j=1;j<=cnt&&i*pri[j]<=n;j++) {
    			vis[i*pri[j]]=1;
    			if (i%pri[j]==0) break;
    			else mu[i*pri[j]]=-mu[i];
    		}
    	}
    	for (int i=1;i<=n;i++) sum[i]=sum[i-1]+mu[i];
    	for (int i=1;i<=n;i++) {
    		for (int l=1,r;l<=i;l=r+1) {
    			r=i/(i/l);
    			f[i]+=1ll*(r-l+1)*(i/l);
    		}
    	}
    }
    int main () {
    	int _;
    	getMu(5e4);
    	scanf("%d",&_);
    	while (_--) {
    		int n,m;
    		scanf("%d%d",&n,&m);
    		if (n>m) swap(n,m);
    		ll ans=0;
    		for (int l=1,r;l<=n;l=r+1) {
    			r=min(n/(n/l),m/(m/l));
    			ans+=1ll*f[n/l]*f[m/l]*(sum[r]-sum[l-1]);
    		}
    		printf("%lld
    ",ans);
    	}
    }
    
    
  • 相关阅读:
    gitblit 配置图文详解
    springmvc文件下载之文件名下划线问题终极解决方案
    redis实战进阶
    关于B+树, 你要了解的都在这里
    http的长连接和短连接(史上最通俗!)以及应用场景
    Base64的前世今生
    Springfox集成Swagger2实战篇
    Minio使用详解
    ubuntu系统五笔输入法安装
    YouTube排名第一的励志英文演讲《Dream(梦想)》
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/15004677.html
Copyright © 2011-2022 走看看