模拟
P5682
先将\(a\)数组排个序并去重。
对于最大值,只能是\(a_{n-1} mod a_n\)
而次大值可以是 \(a_{n-2}moda_n\)或\(a_nmoda_{n-1}\),所以只需要判断一下这两个值即可。
P3951
假设有k个b,那么kb mod a都会覆盖数轴0\~a-1中一个点,而最后一个点被覆盖时,这个数就是(a-1)b,即k=a-1.
所以,在这个数轴上覆盖的点的上一个未覆盖的点就是(a-1)* b-a.
P2822
因为每个组合数都是杨辉三角里的一个数,所以直接打出杨辉三角再计算答案即可。
P1627
将每个大于b的数看成1,小于b的数看成-1,那么只要求出所有包含b并且和为0的区间个数即可。
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
const int N=2e5+10;
int t[N],s[N],a[N],b[N];
int n,m,pos;
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i){
scanf("%lld",&t[i]);
if(t[i]>m) s[i]=1;
else if(t[i]<m) s[i]=-1;
else s[i]=0,pos=i;
}
int tmp=0;
for(int i=pos-1;i>=1;--i){
tmp+=s[i];
if(tmp>=0)a[tmp]++;
else a[tmp+n+n]++;
}
tmp=0;
for(int i=pos+1;i<=n;++i){
tmp+=s[i];
if(tmp>=0)b[tmp]++;
else b[tmp+n+n]++;
}
int ans=1+a[0]+b[0]+a[0]*b[0];
for(int i=1;i<=n;++i){
if(a[n+n-i]>0)ans+=a[n+n-i]*b[i];
}
for(int i=1;i<=n;++i){
if(a[i]>0)ans+=a[i]*b[n+n-i];
}
printf("%lld",ans);
return 0;
}
/*
7 4
5 7 2 4 3 1 6
7 3
6 4 2 3 1 5 7
7 2
6 4 2 3 1 5 7
*/