题目描述
33DAI 经常在数学作业的参考答案中看到:“注意到 3𝑥^2−2𝑥−5=(𝑥−1)(3𝑥+5) 所以 ……” 这样的答案。但是他自己写题时总注意不到,所以他很生气。
为了出题,33DAI 决定给你一个 ({i}x+{n})({j}x+{m})
这样形式的字符串。其中 {i}
,{j}
,{n}
,{m}
都是大于等于 0 的整数。去掉这个括号显然可以得到一个形如 𝑎𝑥^2+𝑏𝑥+𝑐 的多项式,请将其改写成字符串 {a}x^2+{b}x+{c}
的形式,并在第一行按照下面的格式输出:
- 如果
{a}
、{b}
、{c}
中有 0,则去掉对应的那一项,并紧接着去掉多余的+
号。 - 如果
{a}
、{b}
中有 1,则那一项只保留x^2
或x
,不写系数。
然后这显然可以再考考你,如果方程 𝑎𝑥^2+𝑏𝑥+𝑐=0存在整数解,则在第二行输出其中的一个整数解(任意一个都行),否则在第二行输出 No
。
输入格式
输入 ({i}x+{n})({j}x+{m})
这样形式的一个字符串,其中 {i}
,{j}
,{n}
,{m}
都是大于等于 0 的整数。
输出格式
第一行按格式要求输出去掉了小括号后的多项式。
第二行按要求输出一个整数解或者字符串 No
输入数据 1
(7x+3)(1x+1)
输出数据 1
7x^2+10x+3
-1
输入数据 2
(1x+0)(0x+1)
输出数据 2
x
0
输入数据 3
(1x+0)(0x+0)
输出数据 3
33
样例 3 解释
显然此时多项式为 0𝑥^2+0𝑥+0,按要求第一行会得到空串。0𝑥^2+0x+0=0 中所有整数都是 x 的整数解。
输入数据 4
(0x+3)(0x+3)
输出数据 4
9
No
样例 4 解释
显然此时多项式为 0𝑥^2+0𝑥+9,按要求第一行会得到 9
。0𝑥^2+0𝑥+9=0 无解,所以第二行输出 No
。
数据规模与约定
对于 100%100% 的数据,保证 {i}
,{j}
,{n}
,{m}
都不超过 109109。
- 子任务 1(10 分):保证
{i}
,{j}
,{n}
,{m}
都是一位数。 - 子任务 2(20 分):保证 𝑎𝑥2+𝑏𝑥+𝑐=0ax2+bx+c=0 不存在整数解。
- 子任务 3(30 分):保证
{i}
,{j}
,{n}
,{m}
都是大于 0。 - 子任务 4(40 分):没有特殊限制。
代码呈现:
#include <iostream>
#include <cstdio>
#include <string>
#include <cmath>
#define ll long long
using namespace std;
//ll zz1,zz2;
string s;
bool ff;
int zh=0;
double ans1,ans2;
ll num[4];
int idx;
bool zs(double x)
{
if((int)x==x) return true;
return false;
}
int main()
{
//freopen("uqe.in","r",stdin);
//freopen("uqe.out","w",stdout);
cin>>s;
ll len=s.size()-1;
for(int i=0;i<=len;++i)
{
//判断是否是一个数字
if(s[i]>='0' && s[i]<='9')
{
ff=true;
zh=zh*10+s[i]-'0';
}
else
{
//储存数字
if(ff)
{
// cout<<zh<<endl;
num[++idx] = zh;
}
zh=0;
ff=false;
}
}
//计算出 a b c
ll a = num[1]*num[3];
ll b = num[2]*num[3]+num[1]*num[4];
ll c = num[2]*num[4];
//cout<<a<<" "<<b<<" "<<c<<endl;
/*
ll a = (s[1]-'0')*(s[7]-'0');
ll b = (s[4]-'0') * (s[7]-'0') + (s[1]-'0')*(s[10]-'0');
ll c=(s[4]-'0') * (s[10]-'0');
*/
// cout<<a<<" "<<b<<" "<<c<<" "<<endl;
//浅浅的特判一下特殊情况
if(a==0 && b==0 && c==0)
{
cout<<33<<endl;
return 0;
}
if(a==0 && b==0 && c!=0)
{
cout<<c<<endl;
cout<<"No"<<endl;
return 0;
}
if(a==0 && b!=0 && c==0)
{
if(b==1) cout<<'x'<<endl;
else
{
cout<<b<<'*'<<'x'<<endl;
}
cout<<0<<endl;
return 0;
}
if(a==0)
{
double ans=-c*1.0/b;
double sum=-c/b;
if(ans==sum) cout<<sum;
else cout<<"No";
return 0;
}
if(a==0 && b!=0 && c==0)
{
if(b==1) cout<<'x'<<endl;
else
{
cout<<b<<'*'<<'x'<<endl;
}
cout<<0<<endl;
return 0;
}
//计算ax^2+bx+c=0是否有整数解-大功告成
ans1 = (-b+sqrt(b*b-4*a*c))*1.0/(2*a);
// cout<<ans1<<endl;
zz1 = (-b+sqrt(b*b-4*a*c))/(2*a);
// cout<<zz1<<endl;
if(b*b-4*a*c<0)
{
cout<<"No";
return 0;
}
zz2 = (-b-sqrt(b*b-4*a*c))/(2*a);
// cout<<zz2;
ans2 = (-b-sqrt(b*b-4*a*c))*1.0/(2*a);
// cout<<ans2;
cout<<a<<"*x^2+"<<b<<"*x+"<<c<<endl;
if(zs(ans1)) cout<<ans1;
else if(zs(ans2)) cout<<ans2;
else cout<<"No";
return 0;
}