//zjx666
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1000005;
long long w=1000000007;
long long s[maxn];//分子
long long f[maxn];//分母
long long d[maxn];//每个顶点的度
long long r[maxn];//答案数组
long long fast(long long x,long long l) //快速幂处理 a^(w-2)%w
{
long long ans=1;
while(l)
{
if(l%2) ans=ans*x%w;
l=l/2;
x=x*x%w;
}
return ans%w;
}
void set()
{
f[0]=1;
s[0]=1;
for(int i=1;i<=maxn;i++)
s[i]=s[i-1]*i%w;//i的阶乘%w
f[maxn-1]=fast(s[maxn-1],w-2)%w;//费马小定理,1/a%w==a^(w-2)%w
//(除法模运算无分配律,除转乘可以每部mod,防溢出 !!!
for(int i=maxn-2;i>=1;i--)
f[i]=f[i+1]*(i+1)%w;//(1/(a*b*c)%w)*(c%w)==1/(a*b)%w
//模运算的乘法分配率,减少快速幂调用次数,降时间复杂度
}
long long ch(int n,int m)//Cnm组合数
{
return s[n]%w*f[n-m]%w*f[m]%w;
}
int solve()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
d[x]++;
d[y]++;
}
for(int i=1;i<=n;i++)
{
for(int j=2;j<=d[i];j++)//枚举从第i个顶点出发的j星图
{
r[j]=(r[j]+ch(d[i],j))%w;
}
}
long long ans=0;
for(int i=2;i<n;i++)
{
ans=ans^r[i];//异或和
d[i]=0;
r[i]=0;
}
d[1]=0;r[1]=0;d[n]=0;r[n]=0;//初始化,降一点时间复杂度
return ans;
}
int main()
{
ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
set(); //初始化组合数分子、分母的模
int t;
cin>>t;
while(t--)
{
cout<<solve()<<"\n";
}
return 0;
}
2023杭电多校(5)1012补题
于 2023-08-03 23:38:08 首次发布