1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
| ''' Author: NEFU AB-IN Date: 2024-06-26 15:20:32 FilePath: \LeetCode\2741\2741.py LastEditTime: 2024-06-26 20:34:10 '''
from functools import cache from sys import setrecursionlimit, stdin, stdout, exit from collections import Counter, deque, defaultdict from heapq import heapify, heappop, heappush, nlargest, nsmallest from bisect import bisect_left, bisect_right from datetime import datetime, timedelta from string import ascii_lowercase, ascii_uppercase from math import log, gcd, sqrt, fabs, ceil, floor from types import GeneratorType from typing import TypeVar, List, Dict, Any, Callable
class SA:
def __init__(self, x, y): self.x = x self.y = y
def __lt__(self, other): return self.x < other.x
N = int(2e5 + 10) M = int(20) INF = int(2e9) E = int(100)
setrecursionlimit(INF)
input = lambda: stdin.readline().rstrip("\r\n") read = lambda: map(int, input().split()) read_list = lambda: list(map(int, input().split()))
class std:
@staticmethod def bootstrap(f, stack=None): if stack is None: stack = []
def wrappedfunc(*args, **kwargs): if stack: return f(*args, **kwargs) else: to = f(*args, **kwargs) while True: if isinstance(to, GeneratorType): stack.append(to) to = next(to) else: stack.pop() if not stack: break to = stack[-1].send(to) return to
return wrappedfunc
letter_to_num = staticmethod(lambda x: ord(x.upper()) - 65) num_to_letter = staticmethod(lambda x: ascii_uppercase[x]) array = staticmethod(lambda x=0, size=N: [x] * size) array2d = staticmethod( lambda x=0, rows=N, cols=M: [std.array(x, cols) for _ in range(rows)]) max = staticmethod(lambda a, b: a if a > b else b) min = staticmethod(lambda a, b: a if a < b else b) filter = staticmethod(lambda func, iterable: list(filter(func, iterable)))
class Solution:
def specialPerm(self, nums: List[int]) -> int: n = len(nums) all_mask = (1 << n) - 1 MOD = int(1e9 + 7)
@cache def dp(mask, prev_index): if mask == all_mask: return 1
total_perms = 0 for i in range(n): if mask & (1 << i) == 0: if prev_index == -1 or nums[prev_index] % nums[i] == 0 or nums[i] % nums[prev_index] == 0: total_perms = (total_perms + dp(mask | (1 << i), i)) % MOD
return total_perms
return dp(0, -1) def specialPerm(self, nums: List[int]) -> int: MOD = int(1e9 + 7) n = len(nums) f = std.array2d(0, 1 << n, n) for i in range(n): f[1 << i][i] = 1 for state in range(1, 1 << n): for i, x in enumerate(nums): if not state >> i & 1: continue for j, y in enumerate(nums): if i == j or not state >> j & 1: continue if x % y != 0 and y % x != 0: continue f[state][i] = (f[state][i] + f[state ^ (1 << i)][j]) % MOD return sum(f[(1 << n) - 1][i] for i in range(n)) % MOD
|