根据f求出概率再*(n-k)*num就行,但求出的数可能是个小数,所以求概率时要用到逆元。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
map<long long,int> mp;
map<long long,int> mp2;
ll num[100];
ll sum=0;
long long x,y;
ll power(ll a,ll b)
{
ll c=1;
for(;b;b>>=1)
{
if(b&1) c=(long long)c*a%mod;
a=(long long)a*a%mod;
}
return c;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
sum=0;
mp.clear();
mp2.clear();
ll n,k;
scanf("%lld%lld",&k,&n);
for(int i=0;i<k;i++)
{
ll t;
cin>>t;
sum=(sum+t)%mod;
}
for(int i=0;i<k;i++)
{
ll t;
cin>>t;
num[i]=t;
mp[t]++;
}
ll ni=power(k,mod-2);
for(int i=0;i<k;i++)
{
if(mp2[num[i]]==0)
{
ll t=(mp[num[i]]%mod*ni%mod*(n-k)%mod*num[i]%mod)%mod;
sum=(sum+t)%mod;
mp2[num[i]]=1;
}
}
printf("%lld\n",sum);
}
return 0;
}