HDU 3892(多項式ドメインユークリッドアルゴリズム)
1750 ワード
タイトル:http://acm.hdu.edu.cn/showproblem.php?pid=3892
題意:n個の多項式を与え、それらのモード9999983が0に等しいすべてのルートに同じものがあれば「YES」を出力し、そうでなければ「NO」を出力する.
解析:多項式aと多項式bがあると仮定し、a=q*b+r、aとbに共通のルートxがあると仮定すると、xを取るとき、a=q*b+ r=0、b=0である.
したがって、このときrも0に等しいので、a,b,rには同根xがあり、これによりa,bの問題は、b,rの問題となる.そして最大公約数を求める問題です.
題意:n個の多項式を与え、それらのモード9999983が0に等しいすべてのルートに同じものがあれば「YES」を出力し、そうでなければ「NO」を出力する.
解析:多項式aと多項式bがあると仮定し、a=q*b+r、aとbに共通のルートxがあると仮定すると、xを取るとき、a=q*b+ r=0、b=0である.
したがって、このときrも0に等しいので、a,b,rには同根xがあり、これによりa,bの問題は、b,rの問題となる.そして最大公約数を求める問題です.
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
const LL MOD = 999983;
vector p[505];
int T;
LL quick_mod(LL a,LL b,LL m)
{
LL ans = 1;
a %= m;
while(b)
{
if(b&1)
{
ans = ans*a%m;
b--;
}
b>>=1;
a=a*a%m;
}
return ans;
}
vector poly_gcd(vector a,vector b)
{
if(b.size() == 0) return a;
int t = a.size() - b.size();
vector c;
for(LL i=0; i<=t; i++)
{
LL tmp = a[i] * quick_mod(b[0],MOD-2,MOD) % MOD;
for(LL j=0; j= 0)
for(LL i=p; i 1) puts("YES");
else puts("NO");
return;
}
vector v = poly_gcd(p[0],p[1]);
LL i = 2;
while(i < T && v.size() > 1)
{
v = poly_gcd(v,p[i]);
i++;
}
if(v.size() > 1) puts("YES");
else puts("NO");
}
int main()
{
while(Import())
Work();
return 0;
}