滕州网站建设制作,wordpress页面制作视频,qq音乐是哪个公司开发的,柏乡企业做网站自用 因式分解
P2378 因式分解II - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
小玉上了初中#xff0c;开始学因式分解。可是她怎么都解不出来。所以她求你帮忙。
她给你看了她的作业#xff0c;就是因式分解。由于刚开始学#xff0c;就降低了难度。
我们…自用 因式分解
P2378 因式分解II - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
小玉上了初中开始学因式分解。可是她怎么都解不出来。所以她求你帮忙。
她给你看了她的作业就是因式分解。由于刚开始学就降低了难度。
我们假设作业里面的代数只有一个x。最高指数是2且最高指数的系数是1。当x前的系数是1时1省去……反正作业题目符合我们的日常写法
我们帮她解决下这个“简单”的问题吧虽然听起来挺容易但是编程需要考虑很多情况呢
保证作业答案的数字都是整数。
// 这跟神器有什么关系么神说帮助他人积累善行神器自然出现。哈哈哈哈好牵强的解释~
//为了帮助在5月月赛ac这道题目kkksc03偷偷地进行以下的温馨提示
//数据可能会比较刁钻请考虑到各种情况包括只有输入一项的情况、中间过程会不会超maxlongint的情况等。
//lzn喂你这是透题行为是要上法庭的
//absi2011:样例输出里的//及以后字符只是注解,并不要你输出
/* absi2011:输入规范好不和谐啊...
我只是来补充一下...
如果x或者常数项的系数是0 整个省略掉
哦,x的系数是-1的话 也会把1省去...
保证输入的那玩意儿可以分解....而且分解出来都是整数...
*/
// 原作: 2022.7.24 没想到初中时候贡的题已经坑害了这么多人ac了. 现在已经大二时过境迁已经完全不会了哈哈哈
输入格式
一个多项式要求前面已述。各个系数maxlongint。
输出格式
几个乘积。答案也符合日常写法。为了方便老师批改若将答案表示成(xa)(xb)则ab。
什么是日常写法
1、(x0)写成x
2、(xa)(xa)写成(xa)^2
3、有时候可以这样写(x-3)。但是不能出现类似于(x-3)这样的写法
输入输出样例
输入 #1复制
x^2-4
输出 #1复制
(x2)(x-2)
//而不能写成(x-2)(x2)或者(x2)(x-2)
输入 #2复制
x^25x4
输出 #2复制
(x4)(x1)
//不能写成(x1)(x4)
输入 #3复制
x^2-2x1
输出 #3复制
(x-1)^2
输入 #4复制
x^2x
输出 #4复制
(x1)x
//反过来是不可以的。
说明/提示
x次数不高于2次项数不高于3项降幂排列。 这题比较简单虽然调试了这么久先读入多项式ax2bxcax2bxc再求出a,b,ca,b,c的值再套求根公式 x−b±b2−4ac2ax2a−b±b2−4ac,即可因式分解。代码如下
吐槽一下。代码有必要那么长吗
我的代码巨短
#include bits/stdc.h
using namespace std;
string a, c;
double b[10], x1, x2;
void work(double x) {if (x 0) cout x;else {cout (x;if (x 0) cout x );else cout - -x );}
}
int main() {cin a;b[1] 1;//x^2的系数为1 a.erase(0, 3);int pos a.find(x);if (pos -1) b[2] 0;else {c a.substr(0, pos 1);c.erase(--c.end());//忽略x if (c ) b[2] 1;else if (c -) b[2] -1;//特判正负1 else b[2] atof(c.c_str());//求b的系数 }if (pos -1) b[3] atof(a.c_str());else if (pos a.size()) b[3] 0;else c a.substr(pos 1), b[3] atof(c.c_str());//求c的系数 //cout b[1] b[2] b[3];x2 (-b[2] sqrt(b[2] * b[2] - 4 * b[1] * b[3])) / b[1] / 2;x1 (-b[2] - sqrt(b[2] * b[2] - 4 * b[1] * b[3])) / b[1] / 2;//求根 //cout x1 x2;if (x1 x2) work(-x1), cout ^2;else work(-x1), work(-x2);
}
Content
输入一个多项式 x2axbx2axb不保证 a,b≠0a,b0请对这个多项式进行因式分解形式为 (x−x1)(x−x2)(x−x1)(x−x2)其中 x1x2x1x2。
数据范围a,b231a,b231。
Solution
这道题目看上去很简单做起来却有很多的细节要注意。
首先我们可以得到一个大致的思路得到 a,ba,b 之后利用求根公式求出 x1,x2x1,x2
x1,2−a±a2−4b2x1,22−a±a2−4b
当然这是按照题目进行变化后得到的式子我想你们应该都熟悉这个−b±b2−4ac2a2a−b±b2−4ac但因为保证了二次项系数是 11所以没什么必要。
那么完了以后我们的因式分解的结果就是 (x−x1)(x−x2)(x−x1)(x−x2)当然首先如果 x1x2x1x2就得要交换。输出的时候分以下三种情况讨论
x0x0此时因为前面已经带了负号所以直接用 printf((x%d), x) 就好。x0x0此时直接输出 x。x0x0此时用 printf((x%d), x) 输出。
总体来讲就是以上这些操作还需注意一下将 a,ba,b 从字符串中提取出来的问题具体请读者看代码自行理解。
Code
#include cstdio
#include algorithm
#include cstring
#include cmath
#include iostream
using namespace std;string s;
double a, b, flagx, f, now;void print(int xx) {if(xx 0) printf((x%d), xx);else if(!xx) printf(x);else printf((x%d), xx);
}int main() {cin s;int n s.size();f 1;for(int i 3; i n; i)if(s[i] x) flagx 1;if(!flagx) {now 0;for(int i 3; i n; i) {if(s[i] -) f * -1;else if(isdigit(s[i])) now now * 10 s[i] - 0;}b f * now;} else {now 0;for(int i 3; i n; i) {if(s[i] x i 3) {a 1;now 0, f 1;} else if(s[i] x i 3) {a now * f;now 0; f 1;} else if(s[i] -) f * -1;else if(isdigit(s[i])) now now * 10 s[i] - 0;
// printf(now%d\n\n, now);}b f * now;}double x1 -(-a sqrt(a * a - 4 * b)) / 2, x2 -(-a - sqrt(a * a - 4 * b)) / 2;
// printf(%d %d %d %d\n, a, b, x1, x2);if(x1 x2) {print(x1);printf(^2);} else {if(x1 x2) swap(x1, x2);print(x1), print(x2);}return 0;
}
多项式乘法
P2553 [AHOI2001] 多项式乘法 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
请编程序把含有乘法运算的代数多项式表达式改写成不含乘法的代数多项式。为简化计算特做以下约定
代数多项式表达式中只涉及一个代数符号 a保证输入的「含乘法运算的代数多项式」有且仅有一个「代数多项式」与「代数多项式」的乘法。形式化地讲每一个测试点的输入数据中一定有且仅有一行 (...)*(...)其中 ... 为不含乘法运算的代数多项式。一个「不含乘法运算的代数多项式」会被写作 XXXa^YYYXXXa^YYYXXXa^YYY...XXX代表 XXXaYYYXXXaYYYXXXaYYY⋯XXXXXXaYYYXXXaYYYXXXaYYY⋯XXX其中 XXX、YYY 均为正整数且保证除第一项外每一项的 YYY 比上一项的 YYY 少 11。例如一个合法的「不含乘法运算的代数多项式」为 142a^49a^34a^21a^13。 对于约定 3原题目给予了这样一个表述常数项以外的各项都是 xayxay 的形式写作 xa^y其中 xx 为该项的系数而 yy 是该项的指数。x1x1 时不得简写成 a^y应写成 1a^y。而 y1y1 时不得简写成 xa应写成 xa^1。 输入格式
输入仅有一行字符串代表给定的「含乘法运算的代数多项式」。
其格式为(...)*(...)其中 ... 为不含乘法运算的代数多项式。对于「不含乘法运算的代数多项式」的约束请参考题目描述。
输出格式
输出一行一个字符串代表答案。
答案要求指数大的项不能出现在指数小的项之后指数相同的项必须合并同类项。不允许出现不必要的空白字符。输出中不允许有括号。
输入输出样例
输入 #1复制
(5a^23a^12)*(4a^11)
(5a^11)* (5a^11)
输出 #1复制
20a^317a^211a^12
25a^210a^11
说明/提示
关于数据范围以及数据若干格式的说明
系数范围和指数范围均为 [0,30][0,30]。
看到题第一眼就知道这是个暴力处理多项式然后用fft搞就行了。。。
但是有许多坑点比如输入字符串中没有*就什么也不输出题目就™不能讲清楚吗
因为这个WA了好几次又因为只有一个数据点每次都提示输出多了我也看不了别人代码对一下。。。
最后在网上找了一个博客试了几组数据都正确并且ta还不能处理没有括号的情况
看到ta的代码中有一行
if(ppos std::string::npos) continue;这是干啥啊大兄弟。。。似乎是判断有没有*
然后加上就过了。。。这种垃圾题还是别出了QAQ
代码
# includeiostream
# includecstring
# includecstdio
# includecmath
using namespace std;
const int MAX1e61;
const double Piacos(-1.0);
struct complex{double x,y;complex(double X0,double Y0){xX,yY;}
}a[2][MAX];
int n,m,l,lim1;
int r[MAX],len[MAX],ans[MAX];
complex operator (complex x,complex y)
{return complex(x.xy.x,x.yy.y);
}
complex operator- (complex x,complex y)
{return complex(x.x-y.x,x.y-y.y);
}
complex operator* (complex x,complex y)
{return complex(x.x*y.x-x.y*y.y,x.x*y.yx.y*y.x);
}
void fft(complex *A,int tt)
{for(int i0;ilim;i)if(ir[i]) swap(A[i],A[r[i]]);for(int i1;ilim;i1){complex w1(cos(Pi/i),tt*sin(Pi/i));for(int li1,j0;jlim;jl){complex w(1,0);for(int k0;ki;k,ww*w1){complex xA[jk],yw*A[jik];A[jk]xy,A[jik]x-y;}}}if(tt-1)for(int i0;ilim;i)A[i].x(int)(A[i].x/lim0.5);
}
int main()
{string s;while(getline(cin,s)){bool fl0;int Ls.length(),num0;for(int i0;iL;i)if(s[i]*){fl1;break;}if(!fl) continue;memset(a,0,sizeof(a));memset(len,0,sizeof(len));memset(ans,0,sizeof(ans));for(int i0,tt0;iL;itt){tt0;int x0;if(isdigit(s[i])){int ji;while(isdigit(s[j])) tt,xx*10s[j]-48;while(s[j] ) j;if(s[j]a){j2,tt2;int y0;while(isdigit(s[j])) tt,yy*10s[j]-48;len[num]max(len[num],y);a[fl][y].xx;}else if(s[j]||s[j])||s[j]*||jL) a[fl][0].xx;}if(s[i]*||i(tt?tt:1)-1L-1){if(s[i]*) tt;if(num1){lim1,l0;memset(r,0,sizeof(r));while(limlen[num]len[num-1]) lim1,l;for(int j0;jlim;j)r[j](r[j1]1)|((j1)(l-1));fft(a[fl],1),fft(a[fl^1],1);for(int j0;jlim;j)a[fl][j]a[fl][j]*a[fl^1][j];fft(a[fl],-1);for(int j0;jlim;j)a[fl][j].ya[fl^1][j].ya[fl^1][j].x0;len[num]len[num]len[num-1];}num,fl^1;}if(!tt) tt;}bool gg0;for(int j0;jlen[num]len[num-1];j){ans[j]a[fl^1][j].x;if(a[fl^1][j].x!0) gg1;}if(!gg){printf(0\n);continue;}int Len10,Len20;for(int i0;!ans[i];i)Len1;Len2Len1;for(int iLen11;ans[i]!0;i)Len2;if(Len2!Len1) printf(%da^%d,ans[Len2],Len2);for(int iLen2-1;iLen1;--i)printf(%da^%d,ans[i],i);if(!Len1){if(Len2) printf(%d\n,ans[0]);else printf(%d\n,ans[0]);}else{if(Len2!Len1) printf(%da^%d\n,ans[Len1],Len1);else printf(%da^%d\n,ans[Len1],Len1);}}return 0;
}