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

###题意:
∑ i = 1 i ≤ A ∑ j = 1 j ≤ B ∑ k = 1 k ≤ C φ ( g c d ( i , j 2 , k 3 ) ) \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=1iAj=1jBk=1kCφ(gcd(i,j2,k3))


###分析:
膜拜cch。。。
狄利克雷卷积: ( f ∗ g ) ( D ) = ∑ d ∣ D f ( d ) × g ( D d ) (f*g)(D)=\sum_{d|D}f(d)\times g(\frac D d) (fg)(D)=dDf(d)×g(dD)
由狄利克雷卷积的性质,可得
e = 1 ∗ μ e=1*\mu e=1μ(e表示单位元)
φ = φ ∗ e = φ ∗ μ ∗ 1 \varphi=\varphi*e=\varphi*\mu*1 φ=φe=φμ1(单位元卷任意函数等于其本身,且狄利克雷卷积具有交换律)
由此可得,原式= ∑ i = 1 i ≤ A ∑ j = 1 j ≤ B ∑ k = 1 k ≤ C ∑ d ∣ i , d ∣ j 2 , d ∣ k 3 ( φ ∗ μ ) ( 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=1iAj=1jBk=1kCdi,dj2,dk3(φμ)(d)

= ∑ d = 1 d ≤ A ( φ ∗ μ ) ( d ) ∑ i = 1 i ≤ A ∑ j = 1 j ≤ B ∑ k = 1 k ≤ C [ d ∣ i 且 d ∣ j 2 且 d ∣ k 3 ] =\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=1iAj=1jBk=1kC[didj2dk3]

将x唯一分解,设为 x = ∏ p i k i x=\prod p_i^{k_i} x=piki,如果 x ∣ y t x|y^t xyt那么 ∏ p i ⌈ k i t ⌉ ∣ y \prod p_i^{\lceil \frac {k_i} t\rceil}|y pitkiy
f t ( x ) = ∏ p i ⌈ k i t ⌉ f_t(x)=\prod p_i^{\lceil \frac {k_i} t\rceil} ft(x)=pitki

那么原式就可以进一步化为
= ∑ d = 1 d ≤ A ( φ ∗ μ ) ( d ) ⌊ A f 1 ( d ) ⌋ ⌊ B f 2 ( d ) ⌋ ⌊ C f 3 ( 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)Af2(d)Bf3(d)C

(其实 f 1 ( x ) = x f_1(x)=x f1(x)=x)
( φ ∗ μ ) (\varphi *\mu) (φμ)肯定是积性函数,我就不解释了。。。
然后 f t ( 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));
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值