传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5628
狄利克雷卷积
∗
的定义
然后这个过程是支持交换律结合律的
然后这题可以看出求的就是
f0∗1k
快速幂一下就好,复杂度n logn logk
这题存在有实际更优的n sqrt(n) 的做法
#include<bits/stdc++.h>
#define mod 1000000007
#define N 100005
typedef long long ll;
int a[N],b[N],c[N],T,n,k;
inline void mul(int *a,int *b)
{
memset(c,0,sizeof(c));
for (int i=1;i<=n;i++) for (int j=i;j<=n;j+=i) c[j]=(c[j]+(ll)a[j/i]*b[i]) % mod;
memcpy(a,c,sizeof(c));
}
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++) scanf("%d",a+i);
for (int i=1;i<=n;i++) b[i]=1;
for (;k;mul(b,b),k>>=1) if (k&1) mul(a,b);
for (int i=1;i<n;i++) printf("%d ",a[i]);
printf("%d\n",a[n]);
}
}