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±)<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<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 =  + 

<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  + <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 ( = , = <tex2html_verbatim_mark> ).

F(t) = ( + )4 -10( + )2 + 1
  = ( +4 +6 +4 + ) - 10( +2 + ) + 1
  = 9 + 12 +36 + 8 +4 - 10(3 + 2 + 2) + 1
  = (9 + 36 + 4 - 50 + 1) + (12 + 8 - 20)
  = 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  + <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.  + 4<tex2html_verbatim_mark>
  2. mn20<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("\n");
}
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;

UVALIVE 3891 The Teacher's Side of Math的更多相关文章

  1. UVALive 6073 Math Magic

                                                  6073 Math MagicYesterday, my teacher taught us about m ...

  2. UVA 1397 - The Teacher&#39;s Side of Math(高斯消元)

    UVA 1397 - The Teacher's Side of Math 题目链接 题意:给定一个x=a1/m+b1/n.求原方程组 思路:因为m*n最多20,全部最高项仅仅有20.然后能够把每一个 ...

  3. Math Magic(完全背包)

    Math Magic Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Sta ...

  4. ZOJ3662:Math Magic(全然背包)

    Yesterday, my teacher taught us about math: +, -, *, /, GCD, LCM... As you know, LCM (Least common m ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. sqlalchemy 学习-- 多表操作

    一对多:一对一 # one -- many class Students(Base): __tablename__ = "students" sid = Column(Intege ...

  7. sqlalchemy 学习--单表操作

    以下所有代码片段都使用了统一的引用,该引用如下: from sqlalchemy import create_engine, ForeignKey from sqlalchemy.ext.declar ...

  8. [转] fitnesse中的Map处理

    http://blog.csdn.net/doubeizhucele/article/details/42263887 fintesse会把!{}标记的变量视为HashTable对象,展现到页面上的将 ...

  9. zoj3662Math Magic

    Math Magic Time Limit: 3 Seconds       Memory Limit: 32768 KB Yesterday, my teacher taught us about ...

随机推荐

  1. ASP NET Core ---REST & HTTP GET

    参照 草根专栏- ASP.NET Core + Ng6 实战:https://v.qq.com/x/page/h0764n405ll.html 一.REST (Representational Sta ...

  2. LAXCUS对数据存储的优化

        LAXCUS兼容行存储(NSM)和列存储(DSM)两种数据模型,实现了混合存储.同时在分布环境里,做到将数据的分发和备份自动处理,这样就不再需要人工干预了.     行存储,为了兼容广大用户对 ...

  3. python基础训练营02

    任务二 时长:2天 1. 列表 a. 标志 b. 基本操作(创建,append( ),pop( ) ,del( ), 拷贝) c. 列表相关方法 2. 元组 a. 标志 b. 基本操作(创建及不可变性 ...

  4. JavaSE复习(七)Stream流和方法引用

    Stream流 全新的Stream概念,用于解决已有集合类库既有的弊端. 传统集合的多步遍历代码 几乎所有的集合(如 Collection 接口或 Map 接口等)都支持直接或间接的遍历操作.而当我们 ...

  5. [译]如何去除Git的unstaged的文件提示“old mode 100755 new mode 100644”?

    原文来源:https://stackoverflow.com/questions/1257592/how-do-i-remove-files-saying-old-mode-100755-new-mo ...

  6. lintcode-60-搜索插入位置

    60-搜索插入位置 给定一个排序数组和一个目标值,如果在数组中找到目标值则返回索引.如果没有,返回到它将会被按顺序插入的位置. 你可以假设在数组中无重复元素. 样例 [1,3,5,6],5 → 2 [ ...

  7. vue2.0中改变了数组值不能实时反映到页面

    页面中点击事件checkContent,改变row数组中的row[99]的值,如果注释更改,那么页面是不能实时获取的,如图更改,则可以 具体原理:http://blog.csdn.net/websof ...

  8. 算法(5)Jump Game

    题目:非负数的数组,每个数组元素代表这你能最大跨越多少步,初始在0的位置,问,能不能正好调到数组的最后一位! https://leetcode.com/problems/jump-game/#/des ...

  9. 玩转VFS(二)

    关于VFS的第一篇中已经太长了 http://www.cnblogs.com/honpey/p/6348914.html 另起一篇: 1)如何在kernel里找到目前文件系统中的根目录: 2) 如何能 ...

  10. SQL语言:结构化查询语言

    SQL语言:结构化查询语言 程序员或者DBA(数据库管理员)使用SQL和DBBSM进行交互,操纵数据库中的资源 分类: 1.DDL 数据定义语言 结构 create  创建   database ta ...