计蒜客 :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<<' ';
    }
}

 

 

posted @ 2020-04-12 19:04  mcalex  阅读(299)  评论(0编辑  收藏  举报