t1
在一张很大很大的图上找长度一花瓣菊花图个数,从边数2找到n-1;
正解,忘了,我记得是枚举出边个数,枚举到几cnt几就加加
神奇的n乘根号m算法,实际上好像还要乘个根2除个2;
记录每种边数有几个点,记录有几种边数,然后从2->n-1枚举,组合数算出贡献然后乘点数算贡献加加
挂个代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1000000007;
int e[2000010],fac[2000010],inv[2000010],finv[2000010],num[2000010],b[2000010],tot,u,v;
int C(int n,int m){
if(n<m)
return 0;
return fac[n]*finv[m]%mod*finv[n-m]%mod;
}
int n,m,ans;
void init(){
inv[0]=inv[1]=finv[0]=finv[1]=fac[0]=fac[1]=1;
for(int i=2;i<=2*n;i++){
fac[i]=fac[i-1]*i%mod;
inv[i]=mod-inv[mod%i]*(mod/i)%mod;
finv[i]=finv[i-1]*inv[i]%mod;
}
}
signed main(){
freopen("mondstadt.in","r",stdin);
freopen("mondstadt.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
init();
for(int i=1;i<=m;i++){
cin>>u>>v;
e[u]++;
e[v]++;
}
for(int i=1;i<=n;i++){
if(e[i]<2)
continue;
if(!b[e[i]]){
num[++tot]=e[i];
}
b[e[i]]++;
}
sort(num+1,num+1+tot);
for(int i=2;i<n;i++){
int ansn=0;
for(int j=tot;j>=1;j--){
int en=num[j];
if(en<i)
break;
int ch=b[en];
ansn=(ansn+ch*C(en,i))%mod;
}
ans^=ansn;
}
cout<<ans<<'\n';
return 0;
}
t2
分块/树状数组
暴力n3 30pts,原本想要离线询问排序nq,没想出来。
t3
找环,然后找出环中最小的w1 <= w2 <= w3,当前环的寿命就是min(w1+w2,w3)
tarjan我又不会,健忘症烂透了
t4
什么是向量,矢量吗
其实不太看得懂题,高斯消元在精度不行的情况下好像拿70pts