共5个题;
D,F,H难度较低。
B:考位运算中的同或最大值,因为没有同或运算符号,可以求异或的最小值,再用二进制m位都是1的数减去它就是同或的最值
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int main(){
int n,m;
cin>>n>>m;
int a[32]={0};a[0]=1;
int t=1;
for(int i=1;i<=30;i++)
{
t*=2;
a[i]=a[i-1]+t;
}
vector<int>b(n);
for(int i=0;i<n;i++) cin>>b[i];
sort(b.begin(),b.end());
int ans=2e9;
for(int i=0;i<n-1;i++)
{
ans=min(b[i]^b[i+1],ans);
}
cout<<a[m-1]-ans<<endl;
return 0;}
C:主要是数学排列组合的挡板法,快速幂,逆元,阶乘,求mod
刚开始直接写函数来求,发现联合起来内存用太多了,后来看题解后,可以用两个数组来存放阶乘和逆元来减少函数的调用;
#include <bits/stdc++.h>
using namespace std;
const int N=2010;
typedef long long ll;
ll jiec[N],liy[N];
ll p=998244353;
ll qukmi(ll a,ll b){
ll res=1;
while(b){
if(b&1) res=(a*res)%p;
a=(a*a)%p;
b>>=1;
}
return res%p;
}
ll inv(ll a){
return qukmi(a,p-2)%p;
}
void jc(){
jiec[0]=1;
for(int i=1;i<=2000;i++) jiec[i]=(jiec[i-1]*i)%p;
}
ll pl(ll a,ll b){
return ((jiec[a]*inv(jiec[b]))%p*inv(jiec[a-b]))%p;
}
int main(){
jc();
int n,m;
cin>>n>>m;
int arr[N]={0};
ll sum=0,ans=0;
for(int i=0;i<n;i++) {
cin>>arr[i];
sum+=arr[i]-1;
}
//有空闲情况
ll t=m-sum-1;
ans=(pl(t,n)+pl(t,n-1))%p;
//没有空闲情况
//cout<<pl(1000,20);
cout<<ans<<endl;
return 0;}