zoukankan      html  css  js  c++  java
  • 校队训练赛,同时也是HDU4497(数论:素数分解+组合数学)

    一、题目

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

    二、思路
    将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y',x') = 1,同时lcm(x',y',x') = G/L.
    特判,当G%L != 0 时,无解。
    然后素数分解G/L,假设G/L = p1^t1 * p2^t2 *````* pn^tn。
    满足上面条件的x,y,z一定为这样的形式。
    x' = p1^i1 * p2^i2 *```* pn^in.
    y' = p1^j1 * p2^j2 * ```*pn^jn.
    z' = p1^k1 * p2^k2 * ```*pn^kn.
    为了满足上面的条件,对于p1,一定有max(i1,j1,k1) = t1.min(i1,j1,k1) =0;则当选定第一个数为0,第二个数为t1时,第三个数可以为0-t1,又由于有顺序的,只有(0,t1,t1) 和(0,t1,0)这两种情形根据顺序只能产生三种结果,其他的由于三个数都不一样,一定能产生6种,所以最后产生了6*(t1-1)+3*2 = 6*t1种,根据乘法原理以及关于素数分解的唯一性,反过来,素数组合必然也是唯一的数,一共有6*t1 * 6*t2 *`````*6*tn种选法。

     三、代码

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    using namespace std;
    int p[100005];
    long long ans;
    int n;
    long long gcd(int x)
    {
        //int temp = int (sqrt(x) + 1);[如果按这样写,不按下面的写提交时就会出现“编译错误”!!!]
    
        /*sqrt函数
          功 能: 计算一个非负实数的平方根
          函数原型: 在VC6.0中的math.h头文件的函数原型为double sqrt(double);*/
    
        int temp=sqrt(x*1.0+0.5);
        memset(p,0,sizeof(p));
        for(int i = 2; i <= temp; i++)
        {
            while(x%i == 0)
            {
                x = x/i;
                p[i]++;
            }
        }
        if(x != 1) ans = 6;//如果b/a本身是素数
        else ans = 1; 
        for(int i = 2; i <= temp; i++)
        {
            if(p[i])
                ans *= p[i]*6;
        }
        return ans;
    }
    
    int main()
    {
        int a,b;
        scanf("%d",&n);
        while(n--)
        {
            scanf("%d%d",&a,&b);
            if(b%a != 0)
                printf("0
    ");
            else
            {
                printf("%I64d
    ",gcd(b/a));
            }
        }
        return 0;
    }

    四、训练赛的时候没有做出来,一直想着能不能用辗转相除法求三个数的最大公约数。,之后看了http://blog.csdn.net/tobewhatyouwanttobe/article/details/10285863的博客才明白。

    后来,看了别人的思路,自己敲的时候,还是遇到了一些开始没想通的地方,不过,后来都解决了,并且标注到了程序里。

    坦白说,这道题我原来做过类似的,当时做的时候就没大明白,后来解决之后,也没有回顾,更没有再练习相似的题,这是个教训,也值得反思!!!!!

  • 相关阅读:
    Sencha Ext JS 4开发入门教程
    用C#编程从数据库中读取图片数据导进Excel文件的方法
    所选中的要素,赋值给一个定义好的变量pCurFea
    Extjs4.0.7 tree 结构读取json文件(在框架viewport中)
    为什么使用接口编程
    对featureclass中插入和删除feature的几种方法进行了比较
    C#3.0之LINQ数据库表的映射
    c# Linq to sql 基本查询例子
    用ArcEngine的工具条添加图层要素
    ArcGIS Engine开发基础之QI
  • 原文地址:https://www.cnblogs.com/fightfor/p/3960212.html
Copyright © 2011-2022 走看看