题目链接
题意:构造一个含
n
n
n个
k
k
k位二进制数的序列,使得序列中所有数按位与的结果为
0
0
0,且序列和最大,求构造方案数。
思路:对于
n
n
n个数的每一个位,显然都需要至少有一个为
0
0
0,这样才能保证最后按位与结果为
0
0
0;由于要求序列和最大,故每一位上应恰好只有一个
0
0
0,这样对于
k
k
k个位,每个位上的
0
0
0都有
n
n
n种选择,答案为
n
k
n^k
nk.
AC代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
const double eps = 1e-9;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int maxn = 6e6 + 10;
const int MAX = 1e5;
const double pi = acos(-1.0);
const ll INF = 0x3f3f3f3f3f3f3f;
ll qpow(ll a, ll b) {
ll res = 1;
while (b) {
if (b & 1) res = (res * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return res % mod;
}
/***************main****************/
ll T = 1;
ll m, n;
int main() {
T = read();
while (T--) {
n = read();
ll k = read();
cout << qpow(n, k) << endl;
}
return 0;
}