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 ...
随机推荐
- HDFS常用文件操作
put 上传文件 hadoop fs -put wordcount.txt /data/wordcount/ text 查看文件内容 hadoop fs -text /output/wo ...
- 关于Scala文件操作中出现的问题
在各种项目中,我们常常需要用到文件操作,笔者在近期的项目中遇到了一个与文件操作相关的问题. 在代码实现的过程中,笔者首先定义了一个文件路径:def PATH = "/a/b/c.txt&qu ...
- python之pyquery库
如果熟悉jquery,那么使用pyquery进行网页信息提取将会是非常方便的,因为语法都是一样的 1.字符串初始化 2.url和文件初始化 3.CSS选择器 4.子元素 5.父元素 6.兄弟节点 7. ...
- 在Android Studio中创建(或添加)第一个Hello World应用程序
下面我们将使用Android Studio创建第一个简单的Hello World应用程序. 1.打开Android Studio,加载画面如下图所示: 2.选择”Start a new Andro ...
- AngularJS设置文本样式小程序
做了一个这样的程序通过选择框选择样式,下面的段落样式跟着改变.就是想做这么一个东西. <!DOCTYPE html> <html lang="en"> &l ...
- P2168 [NOI2015]荷马史诗
题目描述 追逐影子的人,自己就是影子 ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛&g ...
- 【BZOJ 3172】[Tjoi2013]单词 AC自动机
关于AC自动机:一个在kmp与Trie的基础上建立的数据结构,关键在于Trie树结构与fail指针,他们各有各的应用.在AC自动机里最典型的就是多串匹配,原本效率为O(n*l+n*l+m*l),(n是 ...
- 在Eclipse上使用egit插件通过ssh协议方式上传项目代码的具体步骤
在Eclipse上使用egit插件通过ssh协议方式上传项目代码 前戏: 使用ssh方式可以不通过https协议,避免直接提供账号密码的方式上传项目到git在线服务器,如Bitbucket.GitHu ...
- dns服务 很多问题,后续再研究
慕课网:http://www.imooc.com/video/5220 参考:http://jingyan.baidu.com/article/870c6fc32c028eb03fe4be30.htm ...
- CSS3边框会动的信封
<!DOCTYPE html><html> <head> <title>酷炫的CSS3</title> <meta charset=& ...
+4

+4
+
) - 10(