计蒜客 :Know your aliens(2019 icpc Latin American Regional Contests K)
Know your aliens
题目链接:https://nanti.jisuanke.com/t/44462
解题思路:主要涉及的知识就是给你多项式的零点,让你复原这个多项式
1)如果多项式没有零点的话,那么就直接让这个多项式等于一个常数就行,我们这里假设等于1
2)如果多了一个零点,我们就假设这个零点的值是三,那么我们可以让这个多项式=1*(x-3)=x-3
那么我们可以写出这个多项式的项的系数 从高次向低次依次为1,-3
3)如果有多了一个零点,我们假设这个零点的值是三,同时 多项式=(x-3)*(x-5)=x^2-8*x+15,同样写出系数
为 1,-8,15
4)如果有多了一个零点,假设其值为 5 同上多项式=(x^2-8*x+15)*(x-5)=x^3-13*x^2+55x-75
于是就是有了下面求多项式系数的代码
b[1]=1; for(int i=1;i<=tot;i++){ for(int j=i+1;j>=1;j--)b[j]=b[j-1]; //往左移 for(int j=1;j<=i+1;j++)b[j-1]-=a[i]*b[j];//低幂=低幂-高幂系数*零点值 for(int j=i+1;j>=0;j--) cout<<b[j]<<" "; system("pause"); cout<<i<<endl; }
理解上面,然后就是判断正负的问题,就可以解决这个问题了(👏)
#include<bits/stdc++.h> #define ll long long #define ull unsigned long long using namespace std; const int N=1e4+5,M=1e9+7; const ull base=13331; const double Pi=acos(-1.0); const int inf=0x3f3f3f3f; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } char s[N]; ll a[N],b[N]; int main(){ ios::sync_with_stdio(false); cin>>(s+1); int n=strlen(s+1),tot=0; for(int i=1;i<n;i++){ if(s[i]==s[i+1])continue; a[++tot]=2*i+1; } for(int i=1;i<=tot;i++) cout<<a[i]<<" "; cout<<endl; b[1]=1; for(int i=1;i<=tot;i++){ for(int j=i+1;j>=1;j--)b[j]=b[j-1]; for(int j=1;j<=i+1;j++)b[j-1]-=a[i]*b[j]; for(int j=i+1;j>=0;j--) cout<<b[j]<<" "; system("pause"); cout<<i<<endl; } int sign=1; if(s[1]=='H'&&tot%2)sign=-1; if(s[1]=='A'&&tot%2==0)sign=-1; cout<<tot<<endl; for(int i=tot+1;i>=1;i--){ cout<<b[i]*sign; if(i==1)cout<<endl; else cout<<' '; } }