結果

問題 No.1227 I hate ThREE
ユーザー uni_pythonuni_python
提出日時 2020-09-13 14:30:01
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 262 ms / 2,000 ms
コード長 2,452 bytes
コンパイル時間 186 ms
コンパイル使用メモリ 82,444 KB
実行使用メモリ 124,848 KB
最終ジャッジ日時 2024-06-12 19:04:59
合計ジャッジ時間 6,973 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 62 ms
67,320 KB
testcase_01 AC 58 ms
68,420 KB
testcase_02 AC 53 ms
67,684 KB
testcase_03 AC 83 ms
78,700 KB
testcase_04 AC 90 ms
78,832 KB
testcase_05 AC 85 ms
79,336 KB
testcase_06 AC 53 ms
67,548 KB
testcase_07 AC 51 ms
67,424 KB
testcase_08 AC 88 ms
82,812 KB
testcase_09 AC 88 ms
81,804 KB
testcase_10 AC 71 ms
74,668 KB
testcase_11 AC 222 ms
121,000 KB
testcase_12 AC 237 ms
124,848 KB
testcase_13 AC 62 ms
71,476 KB
testcase_14 AC 81 ms
81,464 KB
testcase_15 AC 94 ms
83,196 KB
testcase_16 AC 125 ms
79,992 KB
testcase_17 AC 102 ms
82,660 KB
testcase_18 AC 161 ms
101,820 KB
testcase_19 AC 130 ms
79,584 KB
testcase_20 AC 171 ms
100,332 KB
testcase_21 AC 62 ms
71,284 KB
testcase_22 AC 145 ms
98,300 KB
testcase_23 AC 238 ms
123,152 KB
testcase_24 AC 240 ms
122,952 KB
testcase_25 AC 242 ms
123,172 KB
testcase_26 AC 231 ms
120,960 KB
testcase_27 AC 235 ms
123,180 KB
testcase_28 AC 241 ms
121,876 KB
testcase_29 AC 246 ms
122,496 KB
testcase_30 AC 244 ms
122,288 KB
testcase_31 AC 256 ms
122,708 KB
testcase_32 AC 262 ms
122,720 KB
testcase_33 AC 230 ms
122,160 KB
testcase_34 AC 235 ms
122,356 KB
testcase_35 AC 235 ms
121,548 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
input=sys.stdin.readline
def I(): return int(input())
def MI(): return map(int, input().split())
def LI(): return list(map(int, input().split()))


"""

根からスタートして+3 or -3 して根まで行きたい,その中で制約を満たさなきゃダメ(1<=p<=C)
N<=1000なので,全部+3とかしても高々+3000しか行かない.
ひとまず制約無視,根を0に固定して(2^(N-1)通り)
最大値,最小値をそれぞれで考えてダメなものを外す?...微妙

木dpとかしたい.O(NC)だけど,Cが大きく根の値が中途半端な時は全通り(=2^(N-1))可能か

根が3N以下ならC=6Nとみなして計算できる

"""
def main():
    mod=10**9+7
    N,C=MI()
    adj=[[]for _ in range(N)]
    for _ in range(N-1):
        a,b=MI()
        a-=1
        b-=1
        adj[a].append(b)
        adj[b].append(a)
        
    ch=[[]for _ in range(N)]
    P=[-1]*N
    import queue
    q=queue.Queue()
    q.put((0,-1))
    
    L=[] # bfsで見る順
    while not q.empty():
        v,p=q.get()
        L.append(v)
        for nv in adj[v]:
            if nv!=p:
                ch[v].append(nv)
                P[nv]=v
                q.put((nv,v))

    L=L[::-1] # dpで見る順
    
    def calc_X(X,flag):
        # 制約が1~X
        
        dp=[[1]*X for _ in range(N)]
        # dp[i][j]はi番目の頂点の値がjであるとき,此の頂点を根とした部分木の通り数
        for v in L:
            p=P[v]
            if p==-1:
                continue
            for j in range(X):
                temp=0
                if j+3<X:
                    temp+=dp[v][j+3]
                if j-3>=0:
                    temp+=dp[v][j-3]
                dp[p][j]*=temp
                dp[p][j]%=mod
                    
                    
        ans=0
        
        if flag==0:
            for j in range(X):
                ans=(ans+dp[0][j])%mod
                
        else:
            for j in range(3*N):
                ans=(ans+dp[0][j])%mod
                
            # for i in range(N):
            #     print(dp[i])
            
        return ans
        
    
    if C<=6*N:
        ans=calc_X(C,0)
        print(ans)
    else:
        temp=calc_X(6*N,1)
        rem=C-6*N
        temp2=pow(2,N-1,mod)
        
        ans= (temp*2 + temp2*rem)%mod
        
        print(ans)
        


                    
                    

main()
0