题目大意:
对于这个一元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;
}
完了。