2022-7-7 个人排位赛4 比赛心得

 

 算法总结:

A:字符串桶+暴力

B:组合数逆元

C:栈模拟或者dfs

D: 异或+打表

EFG:水题

J:构造

K:最小生成树

L:模拟

B: PERICA

题目:

 Perica的钢琴由N个键组成,每个键上都有一个值ai。在Perica弹钢琴时,他会同时按恰好K个不同的键。这架钢琴有点奇怪,因为在同时按下K个键后,它只会弹奏数值最大的那个琴键。Perica将会弹奏K个键的每种组合,他想知道所有组合中的最大值之和是多少。输入第一行包含两个整数N, K (1<N<10,1<K<50)。第二行包含一个长度为N的序列a1,a2,,an (0<ai <10°)。输出输出和,对10°+7取模。

Sample Input

5 3 2 4 2 3 4 5 1 1 0 1 1 1 5 2 3 3 4 0 0

Sample Output

39 4 31

思路:逆元处理组合数

 逆元:a/b%p=(a*(b^(p-2))%p)%p

新增模板:

大数求余的组合写法
int fastpower(int b,int p){
    int r=1;
    while (p>0){
        if (p%2==1){
            r=(r*b)%mod;
        }
        p=p/2;
        b=(b*b)%mod;
    }
    return r;
}
int c(int m,int n){
	if(m==0) return 1;
	if(m>n-m) m=n-m;
	int up=1,down=1;
	for(int i=1;i<=m;i++){
		up=(up*(n-i+1))%mod;
		down=(down*i)%mod;
	}
	return up*fastpower(down,mod-2)%mod;
}
#include <bits/stdc++.h>
#define int long long
#define CIO std::ios::sync_with_stdio(false)
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define nep(i, r, l) for (int i = r; i >= l; i--)
using namespace std;
const int N=2e5+5;
const int mod=1e9+7;
int fastpower(int b,int p){
    int r=1;
    while (p>0){
        if (p%2==1){
            r=(r*b)%mod;
        }
        p=p/2;
        b=(b*b)%mod;
    }
    return r;
}
int c(int m,int n){
	if(m==0) return 1;
	if(m>n-m) m=n-m;
	int up=1,down=1;
	for(int i=1;i<=m;i++){
		up=(up*(n-i+1))%mod;
		down=(down*i)%mod;
	}
	return up*fastpower(down,mod-2)%mod;
}
int a[N];
bool cmp(int a,int b){
	return a>b;
} 
void work(){
	int n,k;cin>>n>>k;
	rep(i,1,n){
		cin>>a[i];
	} 
	sort(a+1,a+n+1,cmp);
	int sum=0;
	rep(i,1,n-k+1){
		sum+=a[i]*c(k-1,n-i);
		sum=sum%mod;
	}
	cout<<sum<<endl;
}
signed main(){
	CIO;
	work();
	return 0;
}

 D:OZLJEDA

由于疯狂地使用球拍杀死苍蝇,Marin遭受了医学界称为肱骨外上髁炎的严重身体伤害(?)。他的祖母建,议涂抹rakija,医生也开了强效止痛药,但Marin无视了每一条建议,并决定在整数序列中寻找答案。他发现了一个以前从未被发现的整数序列,并将其称为xorbonacci序列。序列中的第n个元素用cn表示。该序列以以下方式递归定义:T1 = a C2 = a2Tk= akTn = n-1 Cn-2 n-k, n > k由于一个只有Marin知道的原因,他决定只要你回答他Q个问题,他所有的悲伤都会消失。每个问题会给定l和r。查询的答案以下式表示τι Θ τl+1 r-1 ar帮助Marin回答这些问题。注意:操作0即按位异或。

输入第一行包含一个整数K (1<K<105)。第二行包含K个整数,表示xorbonacci序列的前K个元素。所有数字值均小于1018第三行包含一个整数Q(1<Q<10°)。其后Q行,第i行包含两个整数l和r;,表示Marin的第i次询问。(1<li<ri< 1018)

输出对于每次询问输出一行答案。

Sample Input

4 1 3 5 7 3 2 2 2 5 1 5 5 3 3 4 3 2 4 1 2 1 3 5 6 7 9

Sample Output

3 1 0 0 4 7 4

异或:x^x=0,处理一下前缀异或。

#include <bits/stdc++.h>
#define int long long
#define CIO std::ios::sync_with_stdio(false)
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define nep(i, r, l) for (int i = r; i >= l; i--)
using namespace std;
const int N=2e6+5;
int a[N],p[N];
void work(){
	int k;cin>>k;
	int sum=0;
	rep(i,1,k){
		cin>>a[i];
		p[i]=p[i-1]^a[i];
	}
	a[k+1]=p[k];
	int q;cin>>q;
	int l,r;
	rep(i,1,q){
		cin>>l>>r;
		l=(l-1)%(k+1)+1;
		r=(r-1)%(k+1)+1;
		cout<<(p[r]^p[l-1])<<endl;
	}
}
signed main(){
	CIO;
	work();
	return 0;
}

H题考试中题目看错了。。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁水682

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值