今天作比赛遇上了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 0xfffffff using 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; }
UVA 10951 Polynomial GCD 多项式欧几里德求最大公共多项式
时间: 2024-10-24 12:11:20