1. 程式人生 > >P1072 HanksonHankson 的趣味題

P1072 HanksonHankson 的趣味題

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})$枚舉 $b_1$ 的因子(也就是 x),如果這個數是 $a_1$? 的整數倍並且滿足那兩個式子,則 ans++

#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 的趣味題