UVA 10951 Polynomial GCD 多项式欧几里德求最大公共多项式

来源:互联网 发布:ei数据库怎么进入 编辑:程序博客网 时间:2024/05/22 12:10

今天作比赛遇上了HDU3892,都分析出来怎么做了,可惜不会求多项式的最大公共多项式,当时写了半天,案例也没有跑出来,赛后搜了一下题解,发现有大神做出了,而且是有模版的,不过又搜了一下关于这方面的题目,很少,只发现了这一道,所以先做一下这一道吧


题意,给你两个多项式,求他们的最大公共多项式,然后输出即可,无齿的套用了别人的模版,呵呵!


#include<iostream>#include<cstdio>#include<list>#include<algorithm>#include<cstring>#include<string>#include<stack>#include<map>#include<vector>#include<cmath>#include<memory.h>#include<set>#include<cctype>#define ll long long#define LL __int64#define eps 1e-8//const ll INF=9999999999999;#define inf 0xfffffffusing namespace std;//vector<pair<int,int> > G;//typedef pair<int,int> P;//vector<pair<int,int>> ::iterator iter;////map<ll,int>mp;//map<ll,int>::iterator p;vector<int> G[100000 + 5];int MOD;void clear() {for(int i=0;i<2;i++)G[i].clear();}int quick(int a,int b) {int ans = 1;while(b) {if(b&1) {ans = (ans * a)%MOD;b--;}b >>= 1;a = a * a%MOD;}return ans;}/*多项式求最大公共项*/vector<int> poly_gcd(vector<int> a,vector<int> b) {if(b.size() == 0) return a;int t = a.size() - b.size();vector<int> c;for(int i=0;i<=t;i++) {int tmp =  a[i] * quick(b[0],MOD-2)%MOD;for(ll j=0;j<b.size();j++)a[i+j] = (a[i+j] - tmp * b[j]%MOD + MOD)%MOD;}int p = -1;for(int i=0;i<a.size();i++) {if(a[i] != 0) {p = i;break;}}if(p >= 0) {for(int i=p;i<a.size();i++)c.push_back(a[i]);}return poly_gcd(b,c);}int main() {int Case = 0;while(scanf("%d",&MOD),MOD) {clear();int x;for(int i=0;i<2;i++) {scanf("%d",&x);for(int j=0;j<x+1;j++) {int a;scanf("%d",&a);G[i].push_back(a);}}vector<int> ans = poly_gcd(G[0],G[1]);printf("Case %d: %d",++Case,ans.size() - 1);int tmp = ans[0];for(int i=0;i<ans.size();i++) {ans[i] = ans[i] * quick(tmp,MOD - 2)%MOD;printf(" %d",ans[i]);}puts("");}return 0;}


0 0
原创粉丝点击