C. Yet Another Counting Problem(规律、数学)

C. Yet Another Counting Problem

CF 1342C

题意: t t t次测试,每次测试给定 a 、 b 、 q a、b、q abq
接下来 q q q次询问,给定 l i , r i l_i,r_i li,ri,问在 [ l i , r i ] [l_i,r_i] [li,ri]区间范围内,使得 ( ( x   m o d   a )   m o d   b ) ≠ ( ( x   m o d   b )   m o d   a ) ((x \bmod a)\bmod b)\ne ((x \bmod b)\bmod a) ((xmoda)modb)=((xmodb)moda)的数字x个数

思路:
找规律( a < b a<b a<b)
每个使得 ( ( x   m o d   a )   m o d   b ) = ( ( x   m o d   b )   m o d   a ) ((x \bmod a)\bmod b)=((x \bmod b)\bmod a) ((xmoda)modb)=((xmodb)moda)成立的范围为 [ 1 , b − 1 ] , [ l c m ( a , b ) , l c m ( a , b ) + b − 1 ] [1,b-1],[lcm(a,b),lcm(a,b)+b-1] [1,b1],[lcm(a,b),lcm(a,b)+b1]
r i − l i + 1 r_i-l_i+1 rili+1个数字减去成立的个数: [ 1 , r i i ] [1,r_ii] [1,rii]中成立的个数 c o co co减去 [ 1 , l i − 1 ] [1,l_i-1] [1,li1]中成立的个数 p r pr pr

int n;
/*int main(){///找规律部分
    LL l,a=7ll,b=14ll,r,ans;
    for(int i=1;i<=200;i++){
        if((i%a)%b==(i%b)%a)
            cout<<i<<" ";
    }
    return 0;
}*/
LL ans[maxn];
int main(){
    
    
    int t,f1=0,f0=0,len,q;
    LL l,a,b,r,tt,co,pr,minn,maxx;
    t=ird();
    while(t--){
    
    
        a=lrd();b=lrd();q=ird();
        tt=llcm(a,b);
        if(a>b)swap(a,b);
        if(a==b||b%a==0){
    
    
            for(int i=1;i<=q;i++){
    
    l=lrd();r=lrd();}
            for(int i=1;i<=q;i++)
                cout<<0<<" ";
            cout<<endl;
            continue;
        }
        for(int i=1;i<=q;i++){
    
    
            l=lrd();r=lrd();
            co=r/tt*b;
            if(r<r/tt*tt+b-1&&co){
    
    co-=r/tt*tt+b-1-r;}
            pr=(l-1)/tt*b;
            if((l-1)<(l-1)/tt*tt+b-1&&pr){
    
    pr-=(l-1)/tt*tt+b-1-l+1;}
            co-=pr;
            ans[i]=r-l+1-co;
            minn=min(r,b-1ll);
            maxx=max(l,1ll);
            if(minn>=maxx)ans[i]-=minn-maxx+1;
        }
        for(int i=1;i<=q;i++)
            cout<<ans[i]<<" ";
        cout<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44986601/article/details/105829414