NC245519. 角剖分剖角
描述
输入描述
仅一行,包含一个整数。
输出描述
输出一行,包含一个整数,表示获胜的方案数量,数据保证答案不会超过。
示例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)