传送门:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <iostream>
using namespace std;
#define ll long long
#define re register
const int mod=1e9+7;
inline void read(ll &a)
{
a=0;
int d=1;
char ch;
while(ch=getchar(),ch>'9'||ch<'0')
if(ch=='-')
d=-1;
a=ch^48;
while(ch=getchar(),ch>='0'&&ch<='9')
a=(a<<3)+(a<<1)+(ch^48);
a*=d;
}
ll f[55],a[55];
inline void init()
{
f[0]=1;
for(re int i=1;i<=54;i++)
f[i]=1ll*f[i-1]*i%mod;
}
inline ll quickmod(ll x,int y)
{
ll res=1;
ll base=x%mod;
while(y)
{
if(y&1)
res=res*base%mod;
base=base*base%mod;
y>>=1;
}
return res;
}
inline ll solve(ll n,int m)
{
ll ans=0;
if(n<=m+2)
{
for(re int i=1;i<=n;i++)
(ans+=quickmod(i,m))%=mod;
return ans;
}
ll pos=1,base=0,t;
for(re int i=1;i<=m+2;i++)
(pos*=(n-i))%=mod;
for(re int i=1;i<=m+2;i++)
{
(base+=quickmod(i,m))%=mod;
t=pos*quickmod(n-i,mod-2)%mod;
t=t*quickmod(f[m+2-i]*f[i-1],mod-2)%mod;
if((m+2-i)&1)
ans=((ans-base*t%mod)%mod+mod)%mod;
else
ans=(ans+base*t%mod)%mod;
}
return ans;
}
int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
ll n;
int m;
read(n);
scanf("%d",&m);
for(re int i=1;i<=m;i++)
read(a[i]);
sort(a+1,a+1+m);
ll ans=0;
for(re int i=0;i<=m;i++)
{
(ans+=solve(n-a[i],m+1))%=mod;
for(re int j=i+1;j<=m;j++)
ans=((ans-quickmod(a[j]-a[i],m+1))%mod+mod)%mod;
}
printf("%lld
",ans);
}
return 0;
}