题意:给定$a_0,a_1,b_0,b_1$
问有多少x满足1:$gcd(x,a_0)=a_1$
2:$lcm(x,b_0)=b_1$
思路:暴力枚举(当然不是死枚举)
枚举$a_1$的倍数,判断。。
然而,,,,50分+TLE
正解:
首先:对于已知:1:$gcd(x,a_0)=a_1$得
$gcd(frac{x}{a_1},frac{a_0}{a_1})=1$
2:$lcm(x,b_0)=b_1$ 可得
$gcd(x,b_0)=x*frac{b_0}{lcm(x,b_0)}=x*frac{b_0}{b_1}$
所以:$gcd(frac{x}{frac{x*b_0}{b_1}},frac{b_0}{frac{x*b_0}{b_1}})=1$
化简得:$gcd(frac{b_1}{b_0},frac{b_1}{x})=1$
整理一下: $left{egin{aligned}gcd(frac{x}{a_1},frac{a_0}{a_1})=1\gcd(frac{b_1}{b_0},frac{b_1}{x})=1end{aligned} ight.$
所以: x 是 $a_1$ 的整数倍而且是$b_1$的因子
做法:$O(sqrt{b_1})$
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define olinr return #define love_nmr 0 #define _ 0 int n; int a0,a1,b0,b1; int ans; inline int gcd(int x,int y) { return y? gcd(y,x%y):x; } signed main() { scanf("%d",&n); while(n--) { ans=0; scanf("%d%d%d%d",&a0,&a1,&b0,&b1); int A=a0/a1; int B=b1/b0; for(int i=1;i*i<=b1;i++) { if(b1%i==0) { if(i%a1==0&&gcd(i/a1,A)==1&&gcd(b1/i,B)==1) ans++; int ano=b1/i; if(ano==i) continue; if(ano%a1==0&&gcd(ano/a1,A)==1&&gcd(b1/ano,B)==1) ans++; } } printf("%d ",ans); } olinr ~~(0^_^0)+love_nmr; }