P1072 HanksonHankson 的趣味题

题意:给定$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;
}

 

  

posted @ 2018-08-16 11:49  olinr  阅读(138)  评论(0编辑  收藏  举报