2 条题解
-
1
#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
- 上传者