QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#873627#7514. Clique ChallengelouisliangWA 0ms3712kbC++142.1kb2025-01-26 18:47:222025-01-26 18:47:22

Judging History

你现在查看的是最新测评结果

  • [2025-01-26 18:47:22]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3712kb
  • [2025-01-26 18:47:22]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N = 1005, MOD = 1e9 + 7;
int n, m, d[N], p[N], msk1[N], msk2[N], g[1 << 22];
bool vis[N], e[N][N];
vector <int> vt;
map <int, int> mp;
int solve(){
	vector <int> vl, vr;
	vl.clear();
	vr.clear();
	for(int i = 0; i < vt.size(); i++){
		if(i & 1)
			vl.push_back(i);
		else
			vr.push_back(i);
	}
	int x = vl.size(), y = vr.size();
	mp.clear();
	for(int i = 0; i < y; i++)
		mp[vr[i]] = i;
	for(int i = 0; i < y; i++){
		msk1[i] = 1 << i;
		for(int j = 0; j < y; j++)
			msk1[i] |= (int)e[vr[i]][vr[j]] << j;
	}
	for(int mask = 0; mask < (1 << y); mask++){
		g[mask] = 1;
		for(int j = 0; j < y; j++){
			if(((mask >> j) & 1) && (msk1[j] & mask) != msk1[j]){
				g[mask]--;
				break;
			}
		}
	}
	for(int i = 0; i < y; i++)
		for(int mask = (1 << y) - 1; ~mask; mask--)
			if(!((mask >> i) & 1))
				g[mask | (1 << i)] += g[mask]; 
	for(int i = 0; i < x; i++){
		msk1[i] = 1 << i;
		for(int j = 0; j < x; j++)
			msk1[i] |= (int)e[vl[i]][vl[j]] << j;
	}
	for(int i = 0; i < x; i++){
		msk2[i] = 0;
		for(int j = 0; j < y; j++)
			msk2[i] |= (int)e[vl[i]][vr[j]] << j;
	}
	int sum = 0;
	for(int mask = 0; mask < (1 << x); mask++){
		bool flag = 1;
		int t = (1 << y) - 1;
		for(int i = 0; i < x; i++){
			if(((mask >> i) & 1)){
				if((msk1[i] & mask) != msk1[i]){
					flag = 0;
					break;
				}
				else
					t &= msk2[i];
			}
		}
		if(flag)
			sum = (sum + g[t]) % MOD;
	}
	return sum;
}
int main(){
//	freopen("input.txt", "r", stdin);
//	freopen("output.txt", "w", stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
		p[i] = i;
	for(int i = 1, u, v; i <= m; i++){
		cin >> u >> v;
		e[u][v] = e[v][u] = 1, d[u]++, d[v]++;
	}
	sort(p + 1, p + n + 1, [](int x, int y){return d[x] < d[y];});
	int ans = 0;
	for(int i = 1; i <= n; i++){
		vis[p[i]] = 1;
		vt.clear();
		for(int j = i + 1; j <= n; j++)
			if(e[p[i]][p[j]])
				vt.push_back(p[j]);
		ans = (ans + solve()) % MOD;
	}
	cout << ans << "\n";
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3712kb

input:

3 2
1 2
2 3

output:

5

result:

ok single line: '5'

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 3712kb

input:

3 3
1 2
1 3
2 3

output:

6

result:

wrong answer 1st lines differ - expected: '7', found: '6'