Skip to content

模拟

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
*/
~~所以这么水的题还有写它的必要吗~~