• HDU 4320 Arcane Numbers 1(质因子包含)


    http://acm.hdu.edu.cn/showproblem.php?pid=4320

    题意:

    给出A,B,判断在A进制下的有限小数能否转换成B进制下的有限小数。

    思路:

    这位博主讲得挺不错的http://blog.csdn.net/dgq8211/article/details/7971960

    我就直接引用了吧。。。

    显然若 n 为整数,一定可以,那么我们下面分析一下 n 含小数的情况。

    设 n 的小数部分为 x,且小数部分共 k 位,第 i 位上的数字为 ai。

    那么我们可以将 x 表示成下面式子的形式:

    而在进制转化中,整数部分是“除基倒取余”,小数部分是“乘基正取整”,且乘到小数部分为0时截止。

    于是问题转化成了 x 在什么时候小数部分“乘基”一定会变成0。

    由 x 的表达式我们可知,当且仅当乘数中含有 p^k 这个因子时,x 的小数部分才为0。

    那么就相当于判断 q^h 中是否含有 p^k 这个因子(h 可无限大)。

    又由算术基本定理,p^k 中的质因子一定和 p 中的相同。

    所以只要 q 中包含 p 的所有质因子,就必定存在 h 使得 q^h 中包含 p^k 这个因子,从而使问题有解。

    那么,如何判断 q 中是否包含 p 的所有质因子呢?

    1、若 p 和 q 不互质,则只需要判断 q 中是否包含 p/gcd(p,q) 的所有质因子。

    2、若 p 和 q 互质,当且仅当 p = 1 时,q 中包含 p 的所有质因子。

     
     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 typedef long long ll;
     5 
     6 ll gcd(ll a, ll b)
     7 {
     8     return b==0?a:gcd(b,a%b);
     9 }
    10 
    11 int main()
    12 {
    13     //freopen("in.txt","r",stdin);
    14     int T;
    15     int kase = 0;
    16     scanf("%d",&T);
    17     while(T--)
    18     {
    19         ll a,b,t;
    20         scanf("%lld%lld",&a,&b);
    21         while((t=gcd(a,b))!=1)  a/=t;
    22         printf("Case #%d: ",++kase);
    23         if(a==1)  puts("YES");
    24         else puts("NO");
    25     }
    26     return 0;
    27 }
  • 相关阅读:
    Shodan在渗透测试及漏洞挖掘中的一些用法
    QUdpSocket 简单用法
    用QT操作数据库(本周学的)
    Qt使用UDp通信、套接字socket的成员函数bind()的作用
    ppm的含义
    数字的补数
    两数之和
    C++中的最大整数最小整数
    如何使用dockerfile将jar包生成镜像
    python3解决 json.dumps中文乱码
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/7889051.html
Copyright © 2020-2023  润新知