P1072 HanksonHankson 的趣味題
阿新 • • 發佈:2018-08-16
love namespace efi tle signed hit 暴力 並且 right
題意:給定$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\{\begin{aligned}gcd(\frac{x}{a_1},\frac{a_0}{a_1})=1\\gcd(\frac{b_1}{b_0},\frac{b_1}{x})=1\end{aligned}\right.$
所以: 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\n",ans); } olinr ~~(0^_^0)+love_nmr; }
P1072 HanksonHankson 的趣味題