B. AND 0, Sum Big | #716 Div.2


https://codeforces.com/contest/1514/problem/A
1秒、256 MBメモリ
input :
  • t (1≤t≤10)
  • n k (1≤n≤105, 1≤k≤20).
  • output :
  • For each test case, print the number of arrays satisfying the conditions. Since the answer can be very large, print its remainder when divided by 109+7.
    各テストケースに条件を満たす答えを出力します.数量が多いので、109+7の残りの部分を出力してください.
  • 条件:
  • Given two integers n and k, count the number of arrays of length n such that:
  • all its elements are integers between 0 and 2k−1 (inclusive);
    the bitwise AND of all its elements is 0;
    the sum of its elements is as large as possible.
    nとkの2つの数字を受け取ると、可能な配列数を計算します.
    すべての要素は0~2 k~1の値です.
    すべての要素に対してAND演算を行う場合、結果は0でなければなりません.
    すべての要素の合計はできるだけ大きくしなければなりません.

    AND演算


    この演算の結果はゼロにする必要があります.この意味は少なくとも0を持たなければならないか、または他の2つの数字で0を作成することができる.

    最低価格


    最低価格を維持するために、0 n−1からなる配列を作成することができる.
    また、この値を保持して実行を続行する必要があります.

    境遇


    可能な数字はどれらがありますか.
    配列中の数字はいずれもkビット内のバイナリで表すことができる.
    そして私が初めて思ったことです.
    0, n - 1
    1, n - 2
    ...
    それ以外にも、他の状況があります.
    多くの数字に0(ビット値)があるので、演算でマージできます.
    したがって,0をどのように一定に保つかがこの問題の解決策である.
    私たちが持つことができる数字はn個です.
    これらの数字はkビットを有する.

    ビットの位置


    各ビットの位置で、0を選択した位置は?
    n個です.
    4桁の数字.
    n個持っています.
    _
    ...
    これらのスペースの中から1つを選ぶことができるのでnです
    ビット数で作るので、k回繰り返します.
    import sys
    import math
    
    t = int(sys.stdin.readline())
    for _ in range(t):
        n, k = map(int, sys.stdin.readline().split())
    
        ans = 1
        for i in range(k):
            ans = (ans * n) % int(math.pow(10, 9) + 7)
        print(ans)