题面

题解

Polya 计数。旋转 2 个置换,翻转 3 个置换,单位置换 1 个。

旋转的循环就是每层(?)3 个转,反转就是对角线外两两转。

代码

const int N = 0, bN = 210;

inline ll Read() {
	ll x = 0, f = 1;
	char c = getchar();
	while (c != '-' && (c < '0' || c > '9')) c = getchar();
	if (c == '-') f = -f, c = getchar();
	while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
	return x * f;
}

namespace Main {
	int n, N;
	struct bigNum {
		int a[bN];
		bigNum (int x) { for (memset (a, 0, sizeof a); x; a[++a[0]] = x % 10, x /= 10); }
		void times (int x) {
			int r = 0;
			for (int i = 1; i <= a[0] || r; ++i) {
				int p = a[i] * x + r;
				r = p / 10; a[i] = p % 10;
				a[0] = max(a[0], i);
			}
		}
		void div (int x) {
			int r = 0;
			for (int i = a[0]; i; i--) {
				int p = a[i] + r * 10;
				r = p % x; a[i] = p / x;
			}
			for (; !a[a[0]]; a[0]--);
		}
		void print() { for(int i = a[0]; i; printf("%d", a[i]), i--); putchar(10);}
	};
	bigNum operator + (bigNum a, bigNum b) {
		if (a.a[0] < b.a[0]) swap(a, b);
		int r = 0;
		for (int i = 1; i <= a.a[0] || r; ++i) {
			int p = a.a[i] + b.a[i] + r;
			r = p / 10; a.a[i] = p % 10;
			a.a[0] = max(a.a[0], i);
		}
		return a;
	}
	int main () {
		n = Read(); N = n * (n + 1) / 2;
		bigNum A(1), B(2), C(3);
		for (int i = 1; i <= N; i++) A.times(2);
		for (int i = 1; i <= (N + 2) / 3; i++) B.times(2);
		for (int i = 1; i <= (N - (n + 1) / 2) / 2 + (n + 1) / 2; i++) C.times(2);
		A = A + B + C; 
		A.div(6);
		A.print();
		return 0;
	}
}

int main () {
	string str = "";
//	freopen((str + ".in").c_str(), "r", stdin);
//	freopen((str + ".out").c_str(), "w", stdout);
	Main::main();
	return 0;
}
EOF

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。

博客信息

作者
Jayun
时间
2024-02-28 17:31:25
博客类型