列表

详情


NC245519. 角剖分剖角

描述

因为BeiBei酷爱三角剖分这个算法,于是NingNing融合了正n边形和三角形,为BeiBei创建了一款博弈游戏:初始时有一个正n边形,其顶点都是白色的(可以理解为空心的小圆),BeiBeiNingNing二人轮流进行操作,BeiBei先手,每次操作的内容如下:
  1. 当前回合玩家选择三个为白色的多边形顶点,连成三角形,若这个三角形不会与任何已经被染成黑色的区域有交集(若二者的边、点重合也算有交集),则这个三角形是合法的。
  2. 如果当前玩家,没有办法选择出一个合法的三角形,则当前玩家判负,游戏结束。
  3. 将1中玩家选择的三角形染成黑色。
BeiBeiNingNing都足够聪明,将正n边形按照逆时针从编号,每一步选择不同编号的三个点,认为是不同的走法,请你求解BeiBei第一步必胜的走法方案数。

输入描述

仅一行,包含一个整数

输出描述

输出一行,包含一个整数,表示BeiBei获胜的方案数量,数据保证答案不会超过

示例1

输入:

5

输出:

10

示例2

输入:

45

输出:

540

示例3

输入:

114514

输出:

250442118

示例4

输入:

1919810

输出:

1020265746210

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 42ms, 内存消耗: 4632K, 提交时间: 2023-01-06 20:52:31

pw = [1 for _ in range(30)]
for i in range(1, 30):
    pw[i] = 3 * pw[i - 1]

def solve():
    n = int(input())
    res = 0
    
    for mask in range((n - 9) // 3, (n - 3) // 3 + 1):
        if mask < 0 or mask & 1:
            continue
        d = n - 3 - 3 * mask
        cnt = bin(mask).count('1')
        for a in range(0, 3):
            for b in range(0, 3):
                c = d - a - b
                if c < 0 or c > 2:
                    continue
                res += n * pw[cnt]
    print(res // 3)

for _ in range(1):solve()

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 560K, 提交时间: 2022-11-09 16:01:18

#include <bits/stdc++.h>
#define int long long
using namespace std;

int n;

inline int calc(int x) {
	if (x < 0) return 0; x /= 3;
	if (x & 1) return 0; int res = 1;
	while (x) x &= x - 1, res *= 3; return res;
}

signed main() {
	cin >> n; int res = 0;
	for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j)
		res += calc(n - i - j - 3); cout << res * n / 3 << endl;
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 500K, 提交时间: 2022-11-20 17:03:48

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
inline int calc(int x)
{
    if(x<0) return 0;
    x/=3;
    if(x&1) return 0;
    int res=1;
    while(x) x&=x-1,res*=3;return res;
}
signed main()
{
    cin>>n;
    int res=0;
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            res+=calc(n-i-j-3);
    cout<<res*n/3<<endl;
    return 0;
}

pypy3 解法, 执行用时: 73ms, 内存消耗: 21184K, 提交时间: 2022-11-04 22:03:26

def f(n):
    if n % 2: return 0
    n //= 2
    ans = 1
    for i in range(32):
        if n >> i & 1:
            ans *= 3
    return ans
n = int(input())
ans = 0
for i in range(3):
    for j in range(3):
        for k in range(3):
            x = n - 3 - i - j - k
            if x < 0 or x % 3: continue
            ans += f(x // 3)
print(ans * n // 3)

上一题