题目传送门:H–小沙的数数
题目大意:
有一个a数组,我们已知他的长度为
n
n
n,
a
[
+
]
a[+]
a[+]的和为
m
m
m,请问如果我们想要
a
[
⊕
]
a[⊕]
a[⊕]的值最大,数组a在满足
a
[
+
]
=
m
a[+]=m
a[+]=m时有多少种情况。
a
[
+
]
a[+]
a[+]为
a
[
1
]
+
a
[
2
]
+
.
.
.
.
+
a
[
n
]
a[1]+a[2]+....+a[n]
a[1]+a[2]+....+a[n]
a
[
⊕
]
a[⊕]
a[⊕]为
a
[
1
]
⊕
a
[
2
]
⊕
.
.
.
.
⊕
a
[
n
]
a[1]⊕a[2]⊕....⊕a[n]
a[1]⊕a[2]⊕....⊕a[n]
⊕
为
异
或
⊕为异或
⊕为异或
由于异或会将二进制同位为一的数相抵消,所以要保证拆分后的数相加无进位,因此原数中的各位一互不相扰,通过组合能拼接出各种情况如:
n=5,m=5
5可分为100,001即4,1;
4 0 0 0 0
0 4 0 0 0
0 0 4 0 0
0 0 0 4 0
0 0 0 0 4
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
通过组合可得
5 0 0 0 0
4 1 0 0 0
…
1 4 0 0 0
0 5 0 0 0
…
共计
n
x
n^x
nx种情况,
x
x
x为
m
m
m二进制位数上1的个数。
代码:
#include <bits/stdc++.h>
using namespace std;
const int M = 1e5+10;
typedef long long ll;
const ll mod = 1e9 + 7;
int main()
{
ll n,m;
cin>>n>>m;
ll res = 1;
n = n%mod;
while(m){
if(m&1)res = res*n%mod;
m=m>>1;
}
cout<<res<<endl;
return 0;
}