当前位置: 代码迷 >> 综合 >> 【莫比乌斯反演】HDU6428 Problem C. Calculate
  详细解决方案

【莫比乌斯反演】HDU6428 Problem C. Calculate

热度:77   发布时间:2023-09-27 06:29:24.0

###题意:
∑i=1i≤A∑j=1j≤B∑k=1k≤Cφ(gcd(i,j2,k3))\sum_{i=1}^{i\leq A}\sum_{j=1}^{j\leq B}\sum_{k=1}^{k\leq C}\varphi(gcd(i,j^2,k^3))i=1iA?j=1jB?k=1kC?φ(gcd(i,j2,k3))


###分析:
膜拜cch。。。
狄利克雷卷积:(f?g)(D)=∑d∣Df(d)×g(Dd)(f*g)(D)=\sum_{d|D}f(d)\times g(\frac D d)(f?g)(D)=dD?f(d)×g(dD?)
由狄利克雷卷积的性质,可得
e=1?μe=1*\mue=1?μ(e表示单位元)
φ=φ?e=φ?μ?1\varphi=\varphi*e=\varphi*\mu*1φ=φ?e=φ?μ?1(单位元卷任意函数等于其本身,且狄利克雷卷积具有交换律)
由此可得,原式=∑i=1i≤A∑j=1j≤B∑k=1k≤C∑d∣i,d∣j2,d∣k3(φ?μ)(d)\sum_{i=1}^{i\leq A}\sum_{j=1}^{j\leq B}\sum_{k=1}^{k\leq C}\sum_{d|i,d|j^2,d|k^3}(\varphi*\mu)(d)i=1iA?j=1jB?k=1kC?di,dj2,dk3?(φ?μ)(d)

=∑d=1d≤A(φ?μ)(d)∑i=1i≤A∑j=1j≤B∑k=1k≤C[d∣i且d∣j2且d∣k3]=\sum_{d=1}^{d\leq A}(\varphi*\mu)(d)\sum_{i=1}^{i\leq A}\sum_{j=1}^{j\leq B}\sum_{k=1}^{k\leq C}[d|i且d|j^2且d|k^3]=d=1dA?(φ?μ)(d)i=1iA?j=1jB?k=1kC?[didj2dk3]

将x唯一分解,设为x=∏pikix=\prod p_i^{k_i}x=piki??,如果x∣ytx|y^txyt那么∏pi?kit?∣y\prod p_i^{\lceil \frac {k_i} t\rceil}|ypi?tki????y
ft(x)=∏pi?kit?f_t(x)=\prod p_i^{\lceil \frac {k_i} t\rceil}ft?(x)=pi?tki????

那么原式就可以进一步化为
=∑d=1d≤A(φ?μ)(d)?Af1(d)??Bf2(d)??Cf3(d)?=\sum_{d=1}^{d\leq A}(\varphi*\mu)(d)\lfloor \frac A {f_1(d)}\rfloor \lfloor \frac B {f_2(d)}\rfloor \lfloor \frac C {f_3(d)}\rfloor=d=1dA?(φ?μ)(d)?f1?(d)A???f2?(d)B???f3?(d)C??

(其实f1(x)=xf_1(x)=xf1?(x)=x)
(φ?μ)(\varphi *\mu)(φ?μ)肯定是积性函数,我就不解释了。。。
然后ft(x)f_t(x)ft?(x)也可以通过欧拉筛的性质(被最小的质因数筛到),来线性地筛出来

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#define SF scanf
#define PF printf
#define MAXN 10000010
#define MAXP 10000000
#define MOD 1000000007
using namespace std;
int n;
int f[MAXN],f2[MAXN],f3[MAXN],ti[MAXN],las[MAXN];
bool isprime[MAXN];
int primes[MAXN],tot;
void prepare(){f[1]=1;f2[1]=1;f3[1]=1;for(int i=2;i<=MAXP;i++){if(isprime[i]==0){primes[++tot]=i;f[i]=i-2;las[i]=1;ti[i]=1;f2[i]=i;f3[i]=i;}for(int j=1;1ll*primes[j]*i<=1ll*MAXP;j++){isprime[i*primes[j]]=1;if(i%primes[j]==0){las[i*primes[j]]=las[i];int x=las[i];int p=primes[j];int px=i*primes[j]/las[i];f[i*primes[j]]=(px-2*px/p+px/p/p)*f[x];ti[i*primes[j]]=ti[i]+1;f2[i*primes[j]]=f2[i];if(ti[i]%2==0)f2[i*primes[j]]*=primes[j];f3[i*primes[j]]=f3[i];if(ti[i]%3==0)f3[i*primes[j]]*=primes[j];break;}las[i*primes[j]]=i;ti[i*primes[j]]=1;f[i*primes[j]]=f[i]*f[primes[j]];f2[i*primes[j]]=f2[i]*f2[primes[j]];f3[i*primes[j]]=f3[i]*f3[primes[j]];}}
}
int main(){prepare();SF("%d",&n);int A,B,C;while(n--){SF("%d%d%d",&A,&B,&C);int ans=0;for(int i=1;i<=A;i++)ans+=f[i]*(A/i)*(B/f2[i])*(C/f3[i]);PF("%d\n",ans&((1<<30)-1));}
}
  相关解决方案