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±
)<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:
+ 
<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.
- Coefficients a0,..., ad<tex2html_verbatim_mark> are integers and ad > 0<tex2html_verbatim_mark> .
- F(t) = 0<tex2html_verbatim_mark> .
- The degree d<tex2html_verbatim_mark> is minimum among polynomials satisfying the above two conditions.
- 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.
<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.
+ 
4<tex2html_verbatim_mark>- mn
20<tex2html_verbatim_mark> - 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.
<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的更多相关文章
- UVALive 6073 Math Magic
6073 Math MagicYesterday, my teacher taught us about m ...
- UVA 1397 - The Teacher's Side of Math(高斯消元)
UVA 1397 - The Teacher's Side of Math 题目链接 题意:给定一个x=a1/m+b1/n.求原方程组 思路:因为m*n最多20,全部最高项仅仅有20.然后能够把每一个 ...
- Math Magic(完全背包)
Math Magic Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit Sta ...
- ZOJ3662:Math Magic(全然背包)
Yesterday, my teacher taught us about math: +, -, *, /, GCD, LCM... As you know, LCM (Least common m ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- sqlalchemy 学习-- 多表操作
一对多:一对一 # one -- many class Students(Base): __tablename__ = "students" sid = Column(Intege ...
- sqlalchemy 学习--单表操作
以下所有代码片段都使用了统一的引用,该引用如下: from sqlalchemy import create_engine, ForeignKey from sqlalchemy.ext.declar ...
- [转] fitnesse中的Map处理
http://blog.csdn.net/doubeizhucele/article/details/42263887 fintesse会把!{}标记的变量视为HashTable对象,展现到页面上的将 ...
- zoj3662Math Magic
Math Magic Time Limit: 3 Seconds Memory Limit: 32768 KB Yesterday, my teacher taught us about ...
随机推荐
- 简单的素数问题(C++)
[问题描述] 已知三个素数的和为 n ,正整数 n 由键盘输入,计算并输出这三个素数乘积的最大值. [代码展示] # include<iostream>using namespace st ...
- octomap建立
1.安装ros的octomap ---已完成 2.阅读相关论文,了解其机理,并编写程序实现. 参考网页:https://www.cnblogs.com/gaoxiang12/p/5041142.ht ...
- 数据结构-排序-shell排序
shell排序 首先,希尔排序适用于待排序列关键有序. 接下来一步步图解SHELL排序 我为了方便理解内部操作.我先把代码输出整理下. #include<iostream> #includ ...
- POJ 2168 Joke with Turtles(DP)
Description There is a famous joke-riddle for children: Three turtles are crawling along a road. One ...
- java多线程二之线程同步的三种方法
java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题.java在处理线程同步时,常用方法有: 1.synchronized关键字. 2.Lock显示加锁. 3.信号量Se ...
- [转]学习win10的bash使用ssh连接远程服务器
1. 前言 微软已经在Win10一周年更新预览版中加入了Ubuntu Bash命令支持,相当于一个小型的linux系统,本来连接远程服务器的话,要使用putty啥的,现在可以用这个直接连接,我来讲讲步 ...
- 软工实践Beta冲刺(3/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...
- 【EasyNetQ】- 控制队列名称
在为队列生成名称时,EasyNetQ的默认行为是使用消息类型名称并将其附加到订阅ID.例如PartyInvitation,命名空间中的消息类型EasyNetQ.Tests.Integration将使用 ...
- WCF 动态调用(动态创建实例接口)
很多时候,服务地址都不止一个的,这个时候就要动态去配置地址.配置Web.config,很麻烦 下面就看看怎样实现动态调用WCF. 首先看看动态创建服务对象的代码: using System; usin ...
- DataGridView使用
DataGridView控件概述 DataGridView 控件代码目录(Windows 窗体) 未绑定数据列 定义:可能想要显示并非来自数据源的一列数据,这种列称为未绑定列. 数据格式示例 如何:设 ...
+4

+4
+
) - 10(