Description
Input
Output
Sample Input
2 6 2 2 3 3 3 3 3 23 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
Sample Output
2 7 7 15 7 23 2 9 9 24 9 39 9 50 24 39 9 102 9 39 39 90 9 102 9 102 39 39 9
Data Constraint
f的范围为0到10^9+7-1
Solution
其中1表示在定义域中所有函数值(值域)都为1的函数。(即数组中每个位置都为1)
对于最后一个,可以看成:
因为根据狄利克雷卷积的形式:
(f卷1)的函数的第ik-1项等价于后面的式子
所以有:
...
因此用狄利克雷卷积套上快速幂直接同时求解出所有g数组的值。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define I int
#define ll long long
#define F(i,a,b) for(I i=a;i<=b;i++)
#define Fd(i,a,b) for(I i=a;i>=b;i--)
#define N 100010
#define M 1000000007
using namespace std;
I T,n,k,tot;
ll f[N],g[N],t[N],now[N];
void R(I &x){
x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
}
I main(){
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&k);
F(i,1,n) scanf("%lld",&f[i]);
F(i,1,n) t[i]=g[i]=1ll;
tot=0;
while(k){
if(k&1){
tot++;
if(tot==1){F(i,1,n) g[i]=t[i];}
else{
F(i,1,n) now[i]=0;
F(i,1,n){
F(j,1,n/i) now[i*j]=(now[i*j]+g[i]*t[j]%M)%M;
}
F(i,1,n) g[i]=now[i];
}
}
F(i,1,n) now[i]=0;
F(i,1,n){
F(j,1,n/i) now[i*j]=(now[i*j]+t[i]*t[j]%M)%M;
}
F(i,1,n) t[i]=now[i];
k>>=1;
}
F(i,1,n) now[i]=0;
F(i,1,n){
F(j,1,n/i) now[i*j]=(now[i*j]+f[i]*g[j]%M)%M;
}
F(i,1,n) printf("%d ",now[i]);
printf("\n");
}
return 0;
}
//