【题面】
【题解】
题意:给定一个m层满n叉树和k条边的权值,N表示所需的边的数目,di表示结点i到根结点的距离,输出。
思路:计算每个结点到根结点的距离即父节点到根结点的距离+结点到父节点的距离,并求和取模即可。
【代码】
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
typedef long long ll;
ll d[maxn],a[maxn];
int main()
{
int k,m,n,N; ll p;
while(~scanf("%d%d%d%lld",&k,&m,&n,&p)){
for(int i=1;i<=k;i++)
scanf("%lld",&a[i]),d[i]=0;
sort(a+1,a+1+k);
ll ans=0;
if(n==1) N=m;
else N=(pow(n,m)-1)/(n-1);
for(int i=1;i<N;i++){
d[i]=(d[(i-1)/n]%p+a[i]%p)%p;
ans=(ans+d[i])%p;
}
printf("%lld\n",ans);
}
return 0;
}