算法总结:
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题考试中题目看错了。。