A
暴力没啥好说的
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
signed main(){
fast
int t;cin>>t;
while(t--){
int a[N];
int n;cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++){
int sum=0;
for(int j=0;j<n;j++){
if(j==i)continue;
sum^=a[j];
}
if(sum==a[i]){
cout<<a[i]<<endl;
goto out;
}
}
out:1;
}
return 0^0;
}
B
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int a[N];
signed main(){
fast
int t;cin>>t;
while(t--){
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int cnt=0;
for(int i=2;i<=n;i++){
if(i!=n&&a[i-1]+a[i+1]<a[i])cnt++;
}
if(n<=2){
cout<<0<<endl;
continue;
}
if(m==1&&n%2){
cout<<n/2<<endl;
continue;
}else if(m==1&&n%2==0){
cout<<n/2-1<<endl;
continue;
}
cout<<cnt<<endl;
}
return 0^0;
}
C
三和四的时候都要特判把 其他没啥好说的 m 分 1 和 多就是了
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int a[N];
signed main(){
fast
int t;cin>>t;
while(t--){
int n;cin>>n;
vector<int>cnt;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i])cnt.push_back(a[i]);
}
if(n==3&&cnt.size()==3){
int sum=a[1]+a[2]+a[3];
if(sum==a[3]||sum==a[1]||sum==a[2])cout<<"Yes"<<endl;
else cout<<"No"<<endl;
continue;
}
set<int>s;
if(n==4&&cnt.size()==4){
for(int i=1;i<=4;i++)s.insert(a[i]);
for(int i=1;i<=4;i++){
for(int j=i+1;j<=4;j++){
for(int k=j+1;k<=4;k++){
if(s.count(a[i]+a[j]+a[k])==0){
cout<<"No"<<endl;
goto out;
}
}
}
}
cout<<"Yes"<<endl;
out:1;
continue;
}
if(cnt.size()<=1)cout<<"Yes"<<endl;
else if(cnt.size()==2){
if(cnt[1]+cnt[0]==0)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}else cout<<"No"<<endl;
}
return 0^0;
}
D
题意明显 只交换一次 那么我们只有一个数 会在正确的位置
那我们就可以二分判断 要是有偶数个数他在他应该在的区间内 那么我们就 不应该会有ans在里面
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int a[N];
signed main(){
int t;cin>>t;
while(t--){
int n;cin>>n;
int l=1,r=n;
while(l<=r){
if(l==r){
printf("! %d\n",l);
fflush(stdout);
break;
}
int mid=l+r>>1;
printf("? %d %d\n",l,mid);
int cnt=0;
for(int i=l;i<=mid;i++){
int x;cin>>x;
if(x>=l&&x<=mid)cnt++;
}
if(cnt%2)r=mid;
else l=mid+1;
}
}
return 0^0;
}
885. 求组合数 I
预处理+dp
#include<bits/stdc++.h>
using namespace std;
const int mod =1e9+7;
const int N = 2010;
int c[N][N];
int main(){
for(int i=0;i<=2000;i++){
for(int j=0;j<=i;j++){
if(!j)c[i][j]=1;
else c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
}
int n;cin>>n;
while(n--){
int a,b;cin>>a>>b;
cout<<c[a][b]<<endl;
}
return 0;
}
886. 求组合数 II
还是预处理+乘法逆元
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int a[N],b[N];
int qmi(int a,int k,int p){
int res=1;
while(k){
if(k&1)res=(res*a)%p;
k>>=1;
a=a*a%p;
}
return res;
}
signed main(){
fast
a[0]=b[0]=1;
for(int i=1;i<=1e5;i++){
a[i]=(a[i-1]*i)%mod;
b[i]=b[i-1]*qmi(i,mod-2,mod)%mod;
}
int t;cin>>t;
while(t--){
int x,y;cin>>x>>y;
cout<<a[x]*b[y]%mod*b[x-y]%mod<<endl;
}
return 0^0;
}
887. 求组合数 III
lucas定理+乘法逆元
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int p;
int qmi(int a,int k){
int res=1;
while(k){
if(k&1)res=res*a%p;
a=a*a%p;
k>>=1;
}
return res;
}
int C(int a,int b){
int res=1;
for(int i=a,j=b;j;i--,j--){res=res*i%p*qmi(j,p-2)%p;}
return res;
}
int lucas(int a,int b){
if(a<p&&b<p)return C(a,b);
else return C(a%p,b%p)*lucas(a/p,b/p)%p;
}
signed main(){
fast
int t;cin>>t;
while(t--){
int a,b;cin>>a>>b>>p;
cout<<lucas(a,b)<<endl;
}
return 0^0;
}
888. 求组合数 IV
#include <bits/stdc++.h>
using namespace std;
const int N = 5000+10;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int prime[N],cnt,sum[N];
bool st[N];
void get_prime(int n){
for(int i=2;i<=n;i++){
if(!st[i])prime[cnt++]=i;
for(int j=0;prime[j]<=n/i;j++){
st[prime[j]*i]=true;
if(i%prime[j]==0)break;
}
}
}
vector<int> mul(vector<int>(A),int b){
vector<int> C;
int t=0;
for(int i=0;i<A.size();i++){
t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
while (t)
{
C.push_back(t % 10);
t /= 10;
}
return C;
}
int get(int n,int p){
int res=0;
while(n){
res+=n/p;
n/=p;
}
return res;
}
signed main(){
fast
int a,b;cin>>a>>b;
get_prime(a);
for(int i=0;i<cnt;i++){
int p=prime[i];
sum[i]=get(a,p)-get(b,p)-get(a-b,p);
}
vector<int>res;
res.push_back(1);
for(int i=0;i<cnt;i++){
for(int j=0;j<sum[i];j++){
res=mul(res,prime[i]);
}
}
for(int i=res.size()-1;i>=0;i--)cout<<res[i];
return 0^0;
}
889. 满足条件的01序列
卡特兰数
#include <bits/stdc++.h>
using namespace std;
const int N = 5000+10;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int qmi(int a,int k,int p){
int res=1;
while(k){
if(k&1)res=res*a%p;
a=a*a%p;
k>>=1;
}
return res;
}
signed main(){
fast
int n;cin>>n;
int a=n<<1,b=n;
int ans=1;
for(int i=a,j=b;j;i--,j--){
ans=ans*i%mod*qmi(j,mod-2,mod)%mod;
}
cout<<ans*qmi(b+1,mod-2,mod)%mod<<endl;
return 0^0;
}