UVA 10951 Polynomial GCD 多项式欧几里德求最大公共多项式
2014-05-01 21:36
190 查看
今天作比赛遇上了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 (最大公共多项式)
- HDU3892 Common Roots 多项式欧几里德求最大公共多项式
- UVA 10951 - Polynomial GCD(数论)
- Uva 11488(Trie数统计最大公共子串长度*个数)
- uva 10951 - Polynomial GCD(欧几里得)
- UVA 10951 - Polynomial GCD(数论)
- UVA 10951 - Polynomial GCD []【数论】
- UVa 10951 Polynomial GCD (数论)
- 求公共前缀长度与所选字符串个数的乘积的最大值 Trie树求最值 UVA 11488 Hyper Prefix Sets
- uva 10951 - Polynomial GCD(欧几里得)
- UVa 11488 Hyper Prefix Sets Trie树计算最大公共前缀长度*个数
- 两个或N个字符串最大公共子串算法
- uva 10099(最大生成树+搜索)
- 噪音恐惧症(Audiophobia,UVa10048)——floyd变形,最大最小化
- 求最大公共子串
- 最大公共子串
- 2014美团网的一个笔试题 求两字符串的最大公共字符串长度
- uva 10122 Mysterious Mountain and ZOJ 1231 Mysterious Mountain (二分+二部图最大匹配)
- uva108 Maximum sum(矩阵最大和)
- 找出两个字符串中最大的公共子串的简单实现