求hack,赛时代码码风不好请见谅
#include <bits/stdc++.h>
using namespace std;
using llt=long long;
const llt mod=20070720ll;
llt t,n,k,a[500001],ans=0ll,p[500001],q[500001];
int main()
{
scanf("%lld",&t);
while(t--)
{
ans=0ll;
memset(p,0,sizeof(p));
memset(q,0,sizeof(q));
p[1]=1ll;
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=2;i<=max(30ll,n);i++) p[i]=(p[i-1]*(k%mod))%mod;//每一位的十进制值
for(int i=1;i<=n;i++) q[i]=(q[i-1]+p[i])%mod;
//计算每一位十进制值的前缀和,通过a[i]*q[n-i+1]*i可以算出以a[i]为最高位的k进制数的和
for(int i=1;i<=n;i++) ans=(ans+((((a[i]%mod)*q[n-i+1])%mod)*i)%mod)%mod;
if(k>mod) printf("%lld\n",ans);
else
{
int pos;
for(int i=2,tmp=1;i<=max(30ll,n);i++)
{
if(ans<p[i]||p[i]<=tmp)
{
pos=i-1;
break;
}
tmp=p[i];
}
for(int i=pos;i>=1;i--)
{
printf("%lld ",ans/p[i]);
ans%=p[i];
}
printf("\n");
}//输出答案
}
return 0;
}