csu1706irrational root

来源:互联网 发布:企业软件管理 编辑:程序博客网 时间:2024/05/29 13:48

题目大意:


对于这个一元n次方程,所有的有理根都是整数,并整数根满足在-10到10的范围,求这个方程中无理根的个数。

分析求解:

1.我们枚举r在-10到10范围内的每个整数根,带入方程,判断是否等于0

2.判断是否为重根,对方程依次求导,每次求导后,将r带入方程,等式等于0,即为重根。计数加一。

3,.最后n减去整数根的个数,即为无理根个数

sample input


sample output


上代码分析

int read()
{
    int c=0;
    int f=1;
    char ch;
    ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if (ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        c=c*10+ch-'0';
        ch=getchar();
    }
    return f*c;
}

此段代码为输入段。注意getchar不读white space,所以可以将其跳过。注意输入负号时要乘以负号

LL mod(LL a,LL b)
{
    LL ans=a;
    LL ret=1;
    while(b)
    {
        if(b&1) ret=ret*ans;
        b>>=1;
        ans = ans*ans;
    }
    return ret;
}

此段代码,为求x的几次幂函数,注意类型一定要去长度长long long 否则将会出错。我就是开始没有考虑大小。

int ac[233],bc[233],n;
int main()
{
    n=read();


    for(int i=1; i<=n; ++i) bc[i]=read(); ///系数


    bc[0]=1;


    int ans=0;


    for(int r=-10; r<=10; ++r) ///枚举正整数根的个数


    {


        for(int j=0; j<=n; j++) ac[j]=bc[j];


        LL sum=0;


        for(int i=0; i<=n; ++i)


        {


            sum+=ac[i]*mod(r,n-i);


        }


        if(sum==0)


        {


            ans++;


            for(int k=0; k<n; ++k)  ///求导


            {


                for(int j=n; j>=0; --j)


                {


                    ac[j]*=(n-j-k);


                }


                LL sum=0;


                for(int j=0; j<=n-k-1; ++j)


                {


                    sum+=ac[j]*mod(r,n-j);


                }


                if(sum==0) ans++;


                else break;


            }


        }


    }


    printf("%d\n",n-ans);


    return 0;
}

完了。

0 0