有n个数,
选k个,可以重复选取,
所有可能的结果和是多少。
普通想法就是, 找到所有选取的方法, 然后求总和。
对于选k位,每一位有n中选法,所以一共有nk中结果。
每一位是 a[i]的结果有nk-1种, 一共有n个数。
所以这个一位的总和 是 sum1 = ∑(1~n) nk-1*a[i]
一共有k位, 所以答案 ans = sum1 * k;
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll qmul(ll a, ll n, ll mod)
{
ll ans = 0;
while(n)
{
if(n%2)
{
ans=(ans+a)%mod;
}
a = (a+a)%mod;
n/=2;
}
return ans;
}
ll qpow(ll a, ll n, ll mod)
{
ll ans = 1;
while(n)
{
if(n&1)ans= a*ans%mod;
a = a*a%mod;
n>>=1;
}
return ans;
}
ll a[35555];
int main()
{
ios_base::sync_with_stdio(false);
int T, cnt = 0;
cin>>T;
while(T--)
{
ll n, k, Mod, ans(0);
cin>>n>>k>>Mod;
for(ll i = 0 ;i < n;i++)cin>>a[i];
ll tim = qpow(n, k-1, Mod);
for(ll i = 0;i < n;i++)
{
ans = (ans+qmul(a[i], tim, Mod))%Mod;
}
ans = qmul(ans, k, Mod);
cout<<"Case "<<++cnt<<": "<<ans<<endl;
}
return 0;
}