• P4240毒瘤之神的考验【莫比乌斯反演,平衡规划】


    正题

    题目链接:https://www.luogu.com.cn/problem/P4240


    题目大意

    \(Q\)组数据给出\(n,m\)

    \[\sum_{i=1}^n\sum_{j=1}^m\varphi(i\times j) \]

    \(1\leq Q\leq 10^4,1\leq n,m\leq 10^5\)


    解题思路

    首先需要知道的结论就是

    \[\varphi(i\times j)=\varphi(i)\varphi(j)\frac{gcd(i,j)}{\varphi(gcd(i,j))} \]

    然后推一下式子

    \[\sum_{i=1}^n\sum_{j=1}^m\varphi(i)\varphi(j)\frac{gcd(i,j)}{\varphi(gcd(i,j))} \]

    \[\sum_{d=1}^n\frac{d}{\varphi(d)}\sum_{d|i}^n\sum_{d|j}^m\varphi(i)\varphi(j)[gcd(i,j)=d] \]

    然后莫反一波

    \[\sum_{d=1}^n\frac{d}{\varphi(d)}\sum_{z|d}^n\mu(\frac{z}{d})\sum_{z|i}^n\sum_{z|j}^m\varphi(i)\varphi(j) \]

    提出\(z\)

    \[\sum_{z=1}^n(\sum_{z|i}^n\varphi(i)\sum_{z|j}^m\varphi(j))\sum_{d|z}\mu(\frac{z}{d})\frac{d}{\varphi(d)} \]

    后面那个很好求,线性筛然后\(O(n\log n)\)处理就好了,并且设为\(g_i\),后面需要用到。但是前面那个比较麻烦,而且我们好像就推不动了。

    这其实是一个挺经典的\(track\)的,考虑平衡规划。设定一个\(T\),对于小于等于\(T\)的部分我们暴力算,对于大于\(T\)的部分我们考虑预处理。

    \(f_{i,j}=\sum_{j|x}^i\varphi(x)\),然后再设一个\(h_{i,j,k}\)

    \[h_{i,j,k}=\sum_{x=T+1}f_{i,j}\times f_{i,k}\times g_{i} \]

    这个可以用一个前缀和\(O(n\frac{n}{T}^2)\)的做到。

    然后大于\(T\)的部分我们就可以用上面预处理的\(h\)+整除分块做到\(O(\sqrt n)\)了。

    总共的时间复杂度是\(O(n\sqrt n+nT^2+Q(T+\sqrt n))\)
    \(T\)设为\(n^{\frac{2}{3}}\)就是\(O(n\sqrt n+n^{\frac{4}{3}}+Qn^{\frac{2}{3}})\)了。


    code

    // QuantAsk is stoorz's son
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<cmath>
    #define ll long long
    using namespace std;
    const ll N=1e5+10,P=998244353;
    ll Q,n,m,cnt,pri[N],inv[N],mu[N],phi[N],g[N],o[N];
    bool v[N];vector<ll> f[N],h[N];
    void prime(){
    	phi[1]=mu[1]=1;
    	for(ll i=2;i<N;i++){
    		if(!v[i])pri[++cnt]=i,phi[i]=i-1,mu[i]=-1;
    		for(ll j=1;j<=cnt&&i*pri[j]<N;j++){
    			v[i*pri[j]]=1;
    			if(i%pri[j]==0){
    				phi[i*pri[j]]=phi[i]*pri[j];
    				break;
    			}
    			phi[i*pri[j]]=phi[i]*(pri[j]-1);
    			mu[i*pri[j]]=-mu[i];
    		}
    	}
    	inv[1]=1;
    	for(ll i=2;i<N;i++)
    		inv[i]=P-(P/i)*inv[P%i]%P;
    	for(ll i=1;i<N;i++)
    		for(ll j=i;j<N;j+=i)
    			(g[j]+=inv[phi[i]]*i%P*mu[j/i])%=P;
    	return;
    }
    signed main()
    {
    	prime();
    	ll L=1e5,T=(ll)pow(L,2.0/3.0)+1;
    	f[0].resize(L+1);
    	for(ll i=1;i<=L;i++){
    		f[i].resize(L/i+1);
    		for(ll j=1;j<=L/i;j++)
    			f[i][j]=(f[i][j-1]+phi[i*j])%P;
    	}
    	h[T].resize((L/T)*(L/T)+1);
    	for(ll i=T+1;i<=L;i++){
    		ll p=L/i;h[i].resize(p*p+1);
    		for(ll j=1;j<=p;j++)
    			for(ll k=1;k<=p;k++)
    				h[i][(j-1)*p+k]=(h[i-1][(j-1)*o[i-1]+k]+f[i][j]*f[i][k]%P*g[i]%P)%P;
    		o[i]=p;
    	}
    	scanf("%lld",&Q);
    	while(Q--){
    		scanf("%lld%lld",&n,&m);
    		if(n>m)swap(n,m);ll ans=0;
    		for(ll i=1;i<=min(T,n);i++)
    			(ans+=f[i][n/i]*f[i][m/i]%P*g[i]%P)%=P;
    		for(ll l=T+1,r;l<=n;l=r+1){
    			r=min(n/(n/l),m/(m/l));
    			(ans+=h[r][(n/l-1)*o[r]+m/l]-h[l-1][(n/l-1)*o[l-1]+m/l])%=P;
    		}
    		printf("%lld\n",(ans+P)%P);
    	}
    	return 0;
    }
    
  • 相关阅读:
    性能测试实战
    毕业以后读书报告(不定时更新)
    sqlalchemy.orm.exc.flusherror:错误解决
    Anaconda安装第三方模块
    关于BeanShell报错提示Error invoking bsh method
    jmeter函数和变量
    jmeter插件安装及使用
    doc
    doc
    doc
  • 原文地址:https://www.cnblogs.com/QuantAsk/p/14457371.html
Copyright © 2020-2023  润新知