2 条题解

  • 1
    @ 2023-4-30 22:20:08
    #include<iostream>
    #include<cstdio>
    #define int long long
    using namespace std;
    int n,m,len,a,b,vis[1000001],t,ans;
    void find(int x){
    	for(int i=1;i*i<=x;i++){
    		if(x%i==0){
    			vis[++len]=i;
    			if(i*i!=x)vis[++len]=x/i;
    		}
    	}
    }
    bool check(int x){
    	if((b-a)/x+1>n)return false;
    	if((a-1)/x+(b-a)/x+1+(m-b)/x>=n)return true;
    	return false;
    }
    signed main(){
    	scanf("%lld",&t);
    	for(int i=1;i<=t;i++){
    		scanf("%lld%lld%lld%lld",&n,&m,&a,&b);
    		if(a>b)swap(a,b);
    		ans=len=0;
    		find(b-a);
    		for(int j=1;j<=len;j++)if(check(vis[j]))ans++;
    		printf("%lld\n",ans);
    	}
    }
    /*
    n=4,m=16,a=2,b=8;
    ***~~~a~~~~~~~~~~~b~~~~~~~~~~~~~~~m
    *** - 2 - - - - - 8 - - - - - - - 16
    ***|-|-----------|-|---------------|
    *** |        |    |           |
    *** |        |    |           |
    ***\|/       |   \|/          |
    ***(a-1)/x  \|/   1          \|/
    ***      (b-a)/x          (m-b)/x
    */
    

    信息

    ID
    2950
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    488
    已通过
    28
    上传者