1.一句话定义:
狄利克雷卷积是形如的式子(*是狄利克雷卷积符号,我也不知道手写叉乘行不行 ),它表示的含义为.
2.性质:
狄利克雷卷积满足交换律,结合律。如:
。
还有一个很强的性质:
若,(我的天啊!)
下面给出证明:
。
我们尝试一下从结论出发,
因为a,b互质,所以二者互不相干。如果我们把a看作一个常量,那么等式左边可化为=
。
(感性理解即可)
我们的每一变换都是恒等变化,所以我们也可以由下推到上,也就证明了这个性质的正确性。
3.用途:
狄利克雷卷积可以用来证明莫比乌斯反演。
除此以外,我们还可以利用狄利克雷卷积的强大性质来加快求和。
例题(POJ2480 Longge’s problem):
Longge is good at mathematics and he likes to think about hard mathematical problems which will be solved by some graceful algorithms. Now a problem comes: Given an integer N(1 < N < 2^31),you are to calculate ∑gcd(i, N) 1<=i <=N.
“Oh, I know, I know!” Longge shouts! But do you know? Please solve it.
设,
(狄利克雷卷积)
那么,我们可以直接质因数分解n,利用上面的性质求解。
下面有一个暴力,一个正解。
//vio
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
int p[11],s[11],n;
ll ans;
void dfs(int k,int sum,int phi)//第k个质数,sum为约数d,phi为d的欧拉函数值。
{
if(k>p[0])
{
ans+=n/sum*phi;
return;
}
dfs(k+1,sum,phi);
ll x=p[k];
for(int i=1;i<=s[k];i++)//p[k]^i
{
dfs(k+1,sum*x,(ll)phi*(x/p[k])*(p[k]-1));
x*=p[k];
}
}
int main()
{
while(~scanf("%d",&n))
{
p[0]=0;
memset(s,0,sizeof(s));
int x=n;
for(ll i=2;i*i<=x;i++)
if(x%i==0)
{
p[++p[0]]=i;
do
{
x/=i;
s[p[0]]++;
}while(x%i==0);
}
if(x>1)p[++p[0]]=x,s[p[0]]=1;
ans=0;
dfs(1,1,1);
printf("%lld
",ans);
}
return 0;
}
//std
#include<cstdio>
using namespace std;
typedef long long ll;
ll ans;
int n,p,s;
int main()
{
while(~scanf("%d",&n))
{
ans=1;
for(ll i=2;i*i<=n;i++)
if(n%i==0)
{
s=0;p=1;
do
{
n/=i;
p*=i;
++s;
}while(n%i==0);
ans*=(ll)(s*(i-1)*p/i)+p;
}
if(n>1)ans*=(ll)(n-1)+n;
printf("%lld
",ans);
}
return 0;
}