| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 38945 | LYLAKIOIAKIOI | 【BJ】T3 | C++ | 通过 | 100 | 8 MS | 764 KB | 3299 | 2025-11-19 20:03:50 |
#include<bits/stdc++.h> #define ll long long #define ppc __builtin_popcountll using namespace std; const int N=1e5+10,M=65,mod=1e9+7; void Add(int &a,int b){a+=b;if(a>=mod) a-=mod;} vector<int> E[M]; int f[M][M],du[M],x[M],y[M],w[M]; int fac[N]; int n,k; bool ok[M],vis[M];int dp[2][M][2],tmp[2][N][2]; vector<int> ms; void pdfs(int u,int st){ if(u==st){ dp[0][0][0]=1; dp[1][1][1]=w[u]; }else{ for(int o=0;o<=1;o++)for(int i=k;i>=0;i--){ Add(dp[o][i+1][1],1ll*dp[o][i][0]*w[u]%mod); Add(dp[o][i][0],dp[o][i][1]);dp[o][i][1]=0; } } vis[u]=1; for(auto v:E[u]){ if(vis[v]||!ok[v]) continue; pdfs(v,st); } } void calc(int dep,ll S){ f[dep][0]=1; for(int i=1;i<=k;i++) vis[i]=0,ok[i]=0; ms.clear(); for(int i=1;i<=k;i++){ if((S>>(i-1))&1) ms.push_back(i),ok[i]=1; } sort(ms.begin(),ms.end(),[&](int x,int y){return du[x]<du[y];}); for(auto ed:ms){ if(!vis[ed]){ if(du[ed]==0){ for(int j=ppc(S);j>=1;j--){ f[dep][j]=(f[dep][j]+1ll*f[dep][j-1]*w[ed])%mod; } }else{ memset(dp,0,sizeof(dp)); pdfs(ed,ed); for(int j=ppc(S);j>=0;j--){ for(int x=1;j+x<=ppc(S);x++){ int val=0; if(du[ed]==1){ Add(val,dp[1][x][1]); }Add(val,dp[0][x][0]);Add(val,dp[1][x][0]);Add(val,dp[0][x][1]); Add(f[dep][j+x],1ll*val*f[dep][j]%mod); } } } } } } void dfs(int dep,ll S){ memset(f[dep],0,sizeof(f[dep])); int mx=-1,mxid=0; for(int i=1;i<=k;i++){ if((S>>(i-1))&1){ if(du[i]>mx) mx=du[i],mxid=i; } } if(mx<=2){ calc(dep,S); }else{ vector<int> v1,v2; for(auto x:E[mxid]){ if((S>>(x-1))&1) v1.push_back(x); } for(auto ed:v1)for(auto x:E[ed]){ if((S>>(x-1))&1) v2.push_back(x); } ll ns=S^(1ll<<(mxid-1)); for(auto ed:v1) du[ed]--; dfs(dep+1,ns); for(auto ed:v1) du[ed]++,ns^=(1ll<<(ed-1)); for(int i=0;i<=ppc(S);i++) f[dep][i]=f[dep+1][i]; for(auto ed:v2) du[ed]--; dfs(dep+1,ns); for(auto ed:v2) du[ed]++; for(int i=1;i<=ppc(S);i++) f[dep][i]=(f[dep][i]+1ll*w[mxid]*f[dep+1][i-1])%mod; } } int main(){ //freopen("matrix.in","r",stdin); //freopen("matrix.out","w",stdout); cin>>n>>k; for(int i=1;i<=k;i++) cin>>x[i]>>y[i]>>w[i]; for(int i=1;i<=k;i++) w[i]--; fac[0]=1;for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod; for(int i=1;i<=k;i++){ for(int j=1;j<=k;j++){ if(i==j) continue; if(x[i]==x[j]||y[i]==y[j]){ E[i].push_back(j); } } }for(int i=1;i<=k;i++) du[i]=E[i].size(); ll U=(1ll<<k)-1; dfs(1,U); int ans=0; for(int i=1;i<=k;i++){ ans=(ans+1ll*f[1][i]*fac[n-i])%mod; }Add(ans,fac[n]); cout<<ans<<endl; return 0; }