• UVALIVE 3891 The Teacher's Side of Math


    One of the tasks students routinely carry out in their mathematics classes is to solve a polynomial equation. It is, given a polynomial, sayX2 - 4X + 1<tex2html_verbatim_mark> , to find its roots (2±$ sqrt{{3}}$)<tex2html_verbatim_mark> .

    If the students' task is to find the roots of a given polynomial, the teacher's task is then to find a polynomial that has a given root. Ms. Galsone is an enthusiastic mathematics teacher who is bored with finding solutions of quadratic equations that are as simple as a + b$ sqrt{{c}}$<tex2html_verbatim_mark> . She wanted to make higher-degree equations whose solutions are a little more complicated. As usual in problems in mathematics classes, she wants to maintain all coefficients to be integers and keep the degree of the polynomial as small as possible (provided it has the specified root). Please help her by writing a program that carries out the task of the teacher's side.

    You are given a number t<tex2html_verbatim_mark> of the form:

    t = $displaystyle sqrt[m]{{a}}$ + $displaystyle sqrt[n]{{b}}$

    <tex2html_verbatim_mark>

    where a<tex2html_verbatim_mark> and b<tex2html_verbatim_mark> are distinct prime numbers, and m<tex2html_verbatim_mark> and n<tex2html_verbatim_mark> are integers greater than 1.

    In this problem, you are asked to find t<tex2html_verbatim_mark> 's minimal polynomial on integers, which is the polynomial F(X) = adXd + ad-1Xd-1 + ... a1X +a0<tex2html_verbatim_mark> satisfying the following conditions.

    1. Coefficients a0,..., ad<tex2html_verbatim_mark> are integers and ad > 0<tex2html_verbatim_mark> .
    2. F(t) = 0<tex2html_verbatim_mark> .
    3. The degree d<tex2html_verbatim_mark> is minimum among polynomials satisfying the above two conditions.
    4. F(X)<tex2html_verbatim_mark> is primitive. That is, coefficients a0,..., ad<tex2html_verbatim_mark> have no common divisors greater than one.


    For example, the minimal polynomial of $ sqrt{{3}}$ + $ sqrt{{2}}$<tex2html_verbatim_mark> on integers is F(X) = X4 -10X2 + 1<tex2html_verbatim_mark> . Verifying F(t) = 0<tex2html_verbatim_mark> is as simple as the following ($ alpha$ = $ sqrt{{3}}$,$ eta$ = $ sqrt{{2}}$<tex2html_verbatim_mark> ).

    F(t) = ($ alpha$ + $ eta$)4 -10($ alpha$ + $ eta$)2 + 1
      = ($ alpha^{{4}}_{}$ +4$ alpha^{{3}}_{}$$ eta$ +6$ alpha^{{2}}_{}$$ eta^{{2}}_{}$ +4$ alpha$$ eta^{{3}}_{}$ + $ eta^{{4}}_{}$) - 10($ alpha^{{2}}_{}$ +2$ alpha$$ eta$ + $ eta^{{2}}_{}$) + 1
      = 9 + 12$ alpha$$ eta$ +36 + 8$ alpha$$ eta$ +4 - 10(3 + 2$ alpha$$ eta$ + 2) + 1
      = (9 + 36 + 4 - 50 + 1) + (12 + 8 - 20)$ alpha$$ eta$
      = 0
    <tex2html_verbatim_mark>


    Verifying that the degree of F(t)<tex2html_verbatim_mark> is in fact minimum is a bit more difficult. Fortunately, under the condition given in this problem, which is that a<tex2html_verbatim_mark> and b<tex2html_verbatim_mark> are distinct prime numbers and m<tex2html_verbatim_mark> and n<tex2html_verbatim_mark> greater than one, the degree of the minimal polynomial is always mn<tex2html_verbatim_mark> . Moreover, it is always monic. That is, the coefficient of its highest-order term ( ad<tex2html_verbatim_mark> ) is one.

    Input

    The input consists of multiple datasets, each in the following format.

    a  m  b  n

    <tex2html_verbatim_mark>

    This line represents $ sqrt[m]{{a}}$ + $ sqrt[n]{{b}}$<tex2html_verbatim_mark> . The last dataset is followed by a single line consisting of four zeros. Numbers in a single line are separated by a single space.

    Every dataset satisfies the following conditions.

    1. $ sqrt[m]{{a}}$ + $ sqrt[n]{{b}}$$ le$4<tex2html_verbatim_mark>
    2. mn$ le$20<tex2html_verbatim_mark>
    3. The coefficients of the answer a0,..., ad<tex2html_verbatim_mark> are between (- 231 + 1)<tex2html_verbatim_mark> and (231 - 1)<tex2html_verbatim_mark> , inclusive.

    Output

    For each dataset, output the coefficients of its minimal polynomial on integers F(X) = adXd + ad-1Xd-1 + ... a1X + a0<tex2html_verbatim_mark> , in the following format.

    ad  ad-1 ..  a1  a0

    <tex2html_verbatim_mark>

    Non-negative integers must be printed without a sign (+ or -). Numbers in a single line must be separated by a single space and no other characters or extra spaces may appear in the output.

    3 2 2 2 
    3 2 2 3 
    2 2 3 4 
    31 4 2 3 
    3 2 2 7 
    0 0 0 0
    

    Sample Output

    #include <map>
    #include <set>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <climits>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define PI 3.1415926535897932626
    using namespace std;
    int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
    #define MAXN 25
    const double eps = 1e-8;
    LL a,m,b,n;
    LL C[MAXN][MAXN];
    int Hash[MAXN][MAXN],tot;
    double A[MAXN][MAXN];
    void init()
    {
            for (int i = 0 ; i <= 20 ; i++)
            {
                    C[i][0] = C[i][i] = 1;
                    for (int j = 1; j < i ; j++)
                            C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
            }
            tot = 0;
            for (int i = 0 ; i < m ; i++)
                    for (int j = 0 ; j < n ; j++)
                    Hash[i][j] = tot++;
    }
    void build()
    {
            memset(A,0,sizeof(A));
            A[0][0] = 1;
            for (int i = 1; i <= tot ; i++)
            {
                    for (int j = 0 ; j <= i ; j++)
                    {
                            int l = j , r = i - j;
                            double tmp = C[i][l] * pow(a * 1.0,l / m) * pow(b * 1.0,r / n);
                            l %= m ; r %= n;
                            A[Hash[l][r]][i] += tmp;
                    }
            }
            A[tot][tot] = 1;
            A[tot][tot + 1] = 1;
            tot++;
    }
    void print(double x)
    {
            char s[100];
            sprintf(s,"%.0lf",x);
            if (strcmp(s,"-0") == 0) printf(" %s",s + 1);
            else printf(" %s",s);
    }
    void gauss()
    {
            for (int i = 0 ; i < tot ; i++)
            {
                    int r = i;
                    for (int j = i + 1; j < tot ; j++)
                    {
                            if (fabs(A[j][i]) > fabs(A[r][i])) r = j;
                    }
                    if (fabs(A[r][i]) < eps) continue;
                    for (int j = i ; j <= tot ; j++) swap(A[r][j],A[i][j]);
                    for (int j = 0 ; j < tot ; j++)
                    {
                            if (i == j) continue;
                            if (fabs(A[j][i]) < eps) continue;
                            double tmp = A[j][i] / A[i][i];
                            for (int k = i ; k <= tot ; k++)
                            {
                                    A[j][k] -= tmp * A[i][k];
                            }
                    }
            }
            printf("1");
            for (int i = tot - 2; i >= 0; i--)
            print(A[i][tot] / A[i][i]);
            printf("
    ");
    }
    int main()
    {
            while(scanf("%lld%lld%lld%lld",&a,&m,&b,&n) != EOF)
            {
                    if (n == 0 && m == 0 && b == 0 && n == 0) break;
                    init();
                    build();
                    gauss();
            }
            return 0;
    }
    

      

    1 0 -10 0 1 
    1 0 -9 -4 27 -36 -23 
    1 0 -8 0 18 0 -104 0 1 
    1 0 0 -8 -93 0 24 -2976 2883 -32 -3720 -23064 -29775 
    1 0 -21 0 189 0 -945 -4 2835 -252 -5103 -1260 5103 -756 -2183


    这里思路比较简单。注意有个负0处理参照了别人了的代码。照着抄的。。
    思路就是简单记录a,b的各种次幂组合根据组合数确定系数。最后为0.注意最高项为1;

  • 相关阅读:
    Windows Server2012R2 添加Microsoft .NET Framework 3.5 功能失败的解决方法
    Windows Server2012R2 安装 SharePoint 2013 的必备组件
    pig加载两个不同字段个数的文件?load file with different items(f1有42列,f2有43列读到一个对象中)
    正则表达式的子模式详解
    PHP 递归函数的理解
    仿照美食杰tab选项卡
    tab简单选项卡
    PHP字符串变驼峰方法
    PHP笔试题
    PHP面试题集
  • 原文地址:https://www.cnblogs.com/Commence/p/4337177.html
Copyright © 2020-2023  润新知