码迷,mamicode.com
首页 > 其他好文 > 详细

P1072 HanksonHankson 的趣味题

时间:2018-08-16 14:00:53      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:thml   ase   for   line   sqrt   而且   tin   name   amp   

题意:给定$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 的趣味题

标签:thml   ase   for   line   sqrt   而且   tin   name   amp   

原文地址:https://www.cnblogs.com/olinr/p/9486427.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!