玄关
查看原帖
玄关
730192
gaomingyang101011楼主2025/2/7 13:51

都随了几千个了,还不知哪里错了

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e7+5;
int n,h,r[N],u;
char c[25][25];
vector<int>q[25];
map<vector<int>,bool>mp;
vector<vector<int> >pp;
signed main() {
//	freopen(".in","r",stdin);
	cin>>n>>h;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			cin>>c[i][j];
			if(c[i][j]=='1')q[i].push_back(j);
		}
	}
	vector<int>p;
	p.push_back(1);

	while(mp[p]==0) {
		++u;
		pp.push_back(p);
		bool gg[25]= {0};
		for(int i=0; i<p.size(); i++) {
			int d=p[i];
			gg[d]=1;
			r[u]+=q[d].size();
		}
		for(int i=1; i<=n; i++) {
			if(gg[i]==0) {
				r[u]+=2*q[i].size();
			}
		}
		mp[p]=1;
		int g[25]= {0};
		for(int i=0; i<p.size(); i++) {
			int d=p[i];
			for(int j=0; j<q[d].size(); j++) {
				g[q[d][j]]++;
			}
		}
		p.clear();
		for(int i=1; i<=n; i++) {
			if(g[i]%2==1) {
				p.push_back(i);
			}
		}
	}
	int sd=0;
	for(int i=0; i<pp.size(); i++) {
		if(pp[i]==p) {
			sd=i+1;
		}
	}
	if(h<=sd) {
		int cs=0;
		for(int i=1; i<=h; i++) {
			cs+=r[i];
		}
		int dd=0;
		for(int i=2; i<=n; i++) {
			dd+=2*q[i].size();
		}
		cout<<cs-dd<<"\n";
	} else {
		int cs=0;
		for(int i=1; i<=sd-1; i++) {
			cs+=r[i];
		}
		int f=0;
		for(int i=sd; i<=u; i++) {
			f+=r[i];
		}
		int y=0;
		for(int i=sd; i<=(h-sd+1)%(u-sd+1); i++) {
			y+=r[i];
		}
		int dd=0;
		for(int i=2; i<=n; i++) {
			dd+=2*q[i].size();
		}
		cout<<cs+f*((h-sd+1)/(u-sd+1))+y-dd;
	}
	return 0;
}
/*
20
1000000000
01111111111111111111
10111111111111111111
11011111111111111111
11101111111111111111
11110111111111111111
11111011111111111111
11111101111111111111
11111110111111111111
11111111011111111111
11111111101111111111
11111111110111111111
11111111111011111111
11111111111101111111
11111111111110111111
11111111111111011111
11111111111111101111
11111111111111110111
11111111111111111011
11111111111111111101
11111111111111111110
569999999278
*/
2025/2/7 13:51
加载中...