Codeforces Round #716 (Div. 2)
比赛地址:https://codeforces.com/contest/1514/problem/B
题目大意:求n个k位二进制数构成的序列有多少个,这种序列需要满足1:这n个二进制数按位与都是0,2:这n个k位二进制的和尽可能的大。
思路:对于n 个数的每一个位,显然都需要至少有一个为0 ,这样按位与之后才等于0;因为要求序列和尽可能大,因此每一位上应恰好只有一个0 时是最大的,所以对于k 个位,任选一位为0有n种选择然后一共有k个位,所以答案就是n^k
代码:
#include <iostream>
#include<vector>
#include<cmath>
typedef long long ll;
const int mod=1000000007;
using namespace std;
ll qpow(ll x,ll n) {
ll res = 1;
x%=mod;
while (n) {
if(n&1) res = res*x%mod;
x = x*x %mod;
n >>=1;
}
return res;
}
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,k,ans;
cin>>n>>k;
ans=qpow(n,k);
cout<<ans<<endl;
}
return 0;
}