传送门
题解:
当k=1的时候
g
(
i
)
=
∑
i
1
∣
i
f
(
i
1
)
g(i)=∑_{i1|i}f(i1)
g(i)=∑i1∣if(i1)写成狄利克雷卷积形式为
g
=
f
∗
I
g=f*I
g=f∗I
k=2
g
=
(
f
∗
I
)
∗
I
g=(f*I)*I
g=(f∗I)∗I
以此类推:
g
=
f
∗
(
I
)
k
g=f*(I)^k
g=f∗(I)k
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N=1e5+7;
int a[N],tmp[N],g[N],I[N],n,k;
const int mod = 1e9 + 7;
void mul(int *a,int *b)
{
for(int i=1;i<=n;i++) tmp[i]=0;
for(int i=1;i<=n;i++){
for(int j=1;j*i<=n;j++){
tmp[i*j]=(tmp[i*j]+1ll*a[i]*b[j])%mod;
}
}
for(int i=1;i<=n;i++) a[i]=tmp[i];
}
int main()
{
int t; scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&g[i]),I[i]=1;
while(k){
if(k&1) mul(g,I);
mul(I,I);
k>>=1;
}
for(int i=1;i<=n;i++) printf("%d%c",g[i],i==n?'\n':' ');
}
}