此题不难,但我就是RE,搞不懂啊。。。郁闷。

说下基本算法吧,只要留意到要分解的因式是(x+ai)..的形式,x前是系数为1的,而且,它们的绝对值在1000以内,于是,好办了。只要枚举(x+k)中的k就可以了。然后按照除法得出余下的因式就OK了。注意结束的条件,最高次必须系数是1,结束后0次的也应当是1.

我觉得我RE这么多次很可怜。。。

)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cctype>
  5. #include <algorithm>
  6. #include <vector>
  7. using namespace std;
  8.  
  9. struct Multi{
  10. int coef[10];
  11. int len_pow;
  12. void init(){
  13. len_pow=-1;
  14. memset(coef,0,sizeof(coef));
  15. }
  16. };
  17. Multi f,g;
  18.  
  19. char str[150],ts[150];
  20. vector<int>ans;
  21.  
  22. void deal(char s[]){
  23. int index=0,len=strlen(s);
  24. for(index;index<len;index++){
  25. if(s[index]=='x')
  26. break;
  27. }
  28. int cof=0,sig=1;
  29. for(int i=0;i<index;i++){
  30. if(s[i]=='-') sig=-1;
  31. else{
  32. cof=cof*10+s[i]-'0';
  33. }
  34. }
  35. if(cof==0) cof=1;
  36. cof=cof*sig;
  37. int _pow=0;
  38. for(int i=index+2;i<len;i++){
  39. _pow=_pow*10+s[i]-'0';
  40. }
  41. if(_pow==0&&index!=len) _pow=1;
  42. f.coef[_pow]+=cof;
  43. }
  44.  
  45. bool Div(int k){
  46. g.init();
  47. for(int i=f.len_pow;i>=1;i--){
  48. g.coef[i-1]=f.coef[i]-k*g.coef[i];
  49. // if(k==-1) cout<<i-1<<" "<<g.coef[i-1]<<" "<<k<<endl;
  50. }
  51. for(g.len_pow=f.len_pow-1;g.len_pow>=0;g.len_pow--)
  52. if(g.coef[g.len_pow]) break;
  53. if(g.coef[0]*k!=f.coef[0]) return false;
  54. if(g.len_pow>=0&&g.coef[g.len_pow]!=1) return false;
  55. f=g;
  56. if(f.len_pow==0&&f.coef[f.len_pow]==1) f.len_pow=-1;
  57. return true;
  58. }
  59.  
  60. bool slove(){
  61. ans.clear();
  62. while(f.coef[0]==0&&f.len_pow>=0){
  63. ans.push_back(0);
  64. for(int i=0;i<f.len_pow;i++){
  65. f.coef[i]=f.coef[i+1];
  66. }
  67. f.coef[f.len_pow]=0;
  68. f.len_pow--;
  69. }
  70. // if(f.len_pow<0) return false;
  71. if(f.len_pow==0) return true;
  72. for(int i=-1000;i<=1000;i++){
  73. if(i==0) continue;
  74. if(i!=0&&f.coef[0]%i!=0) continue;
  75. if(Div(i)){
  76. ans.push_back(i);
  77. i--;
  78. if(f.len_pow==-1) return true;
  79. }
  80. }
  81. return false;
  82. }
  83.  
  84. int main(){
  85. int T,t=0;
  86. scanf("%d",&T);
  87. while(T--){
  88. scanf("%s",str);
  89. char *p;
  90. p=strtok(str,"+");
  91. f.init();
  92. while(p){
  93. strcpy(ts,p);
  94. deal(ts);
  95. p=strtok(NULL,"+");
  96. }
  97. for(int i=5;i>=0;i--)
  98. if(f.coef[i]){
  99. f.len_pow=i;
  100. break;
  101. }
  102. printf("Case #%d: ",++t);
  103. if(f.len_pow<0){
  104. puts("-1");
  105. continue;
  106. }
  107. if(f.coef[f.len_pow]!=1){
  108. puts("-1");
  109. continue;
  110. }
  111. // for(int i=0;i<=5;i++) cout<<i<<" "<<f.coef[i]<<endl;
  112. bool flag=slove();
  113. if(!flag) { puts("-1"); continue;}
  114. sort(ans.begin(),ans.end());
  115. for(int i=0;i<ans.size();i++)
  116. if(ans[i]==0)
  117. printf("x");
  118. else if(ans[i]>0)
  119. printf("(x+%d)",ans[i]);
  120. else printf("(x%d)",ans[i]);
  121. puts("");
  122. }
  123. return 0;
  124. }

  

贴个别人的。http://hi.baidu.com/chenwenwen0210/item/692b312f5ab859312b0f1cc8

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4.  
  5. using namespace std ;
  6. const int MAX=110;
  7. const int INF=100000000;
  8. char s[MAX];
  9. int c[6];
  10. struct BigNum
  11. {
  12. int dig[6];
  13. int len;
  14. void clr()
  15. {
  16. len=1;
  17. memset(dig,0,sizeof(dig));
  18. }
  19. };
  20.  
  21. bool dig(char x){return x>='0'&&x<='9';}
  22. BigNum f;
  23. BigNum Div(BigNum a,int b)
  24. {
  25. int i;
  26. int t;
  27. BigNum ret;
  28. ret.clr();
  29. for(i=a.len-1;i>=1;i--)
  30. {
  31. t=a.dig[i];
  32. ret.dig[i-1]+=t;
  33. a.dig[i]=0;
  34. a.dig[i-1]-=b*t;
  35. }
  36. ret.len=-1;
  37. if(a.dig[0]!=0)return ret;
  38.  
  39. for(i=5;i>=0&&ret.dig[i]==0;i--);
  40.  
  41. ret.len=i+1;
  42. return ret;
  43. }
  44. int calc()
  45. {
  46. int i;
  47. if(f.dig[0]==0)
  48. {
  49. for(i=0;i+1<f.len;i++)
  50. {
  51. f.dig[i]=f.dig[i+1];
  52. }
  53. f.len--;
  54. return 0;
  55. }
  56. for(i=-1000;i<=1000;i++)
  57. {
  58. if(i==0&&f.dig[0]!=0)continue;
  59. else if(i!=0&&f.dig[0]%i!=0)continue;
  60.  
  61. BigNum tmp=Div(f,i);
  62. if(tmp.len==-1)continue;
  63. f=tmp;
  64. return i;
  65. }
  66. return INF;
  67. }
  68. int main ()
  69. {
  70. int T,CS=1;
  71. int len;
  72. int tmp,p;
  73. int i;
  74. scanf("%d",&T);
  75. while (T--)
  76. {
  77. scanf("%s",s);
  78. memset(c,0,sizeof(c));
  79. len=strlen(s);
  80. int left,right;
  81. for(i=0;i<len;i++)
  82. {
  83. if(s[i]=='x')
  84. {
  85. //计算有边
  86. if(s[i+1]=='^')
  87. {
  88. right=i+2;
  89. p=s[right]-'0';//最多是5,取1为就行了
  90. }
  91. else
  92. {
  93. right=i;
  94. p=1;
  95. }
  96.  
  97. int ten=1;
  98.  
  99. left=i-1;
  100. tmp=0;
  101. while(left>=0&&dig(s[left]))
  102. {
  103. tmp+=(s[left]-'0')*ten;
  104. ten*=10;
  105. left--;
  106. }
  107.  
  108. if(tmp==0)tmp++;
  109.  
  110. if(left>=0&&s[left]=='-')
  111. {
  112. tmp=-tmp;
  113. left--;
  114. }
  115.  
  116. c[p]+=tmp;
  117.  
  118. for(left++;left<=right;left++)
  119. {
  120. s[left]=1;
  121. }
  122. }
  123. }
  124. //puts("zz");
  125. for(i=0;i<len;i++)//求剩下的常数
  126. {
  127. if(s[i]=='-'||dig(s[i]))
  128. {
  129. int sign=1;
  130. tmp=0;
  131. if(s[i]=='-')
  132. {
  133. sign=-1;
  134. i++;
  135. }
  136. while(i<len&&dig(s[i]))
  137. {
  138. tmp=tmp*10+s[i]-'0';
  139. i++;
  140. }
  141. i--;
  142. c[0]+=tmp*sign;
  143. }
  144. }
  145. int maxc=5;
  146. while(maxc>=0&&c[maxc]==0)
  147. {
  148. maxc--;
  149. }
  150. printf("Case #%d: ",CS++);
  151. if(maxc<=0)
  152. {
  153. puts("-1");
  154. continue;
  155. }
  156. else if(c[maxc]!=1)
  157. {
  158. puts("-1");
  159. continue;
  160. }
  161. //puts("");for(i=0;i<=maxc;i++)printf("x[%d]=%d\n",i,c[i]);
  162. int ans[6];
  163.  
  164. f.clr();
  165. memcpy(f.dig,c,sizeof(c));
  166. f.len=maxc+1;
  167. for(i=0;i<maxc;i++)
  168. {
  169. ans[i]=calc();
  170. if(ans[i]==INF)break;
  171. }
  172. if(i<maxc)
  173. {
  174. puts("-1");
  175. }
  176. else
  177. {
  178. sort(ans,ans+maxc);
  179. for(i=0;i<maxc;i++)
  180. {
  181. if(ans[i]==0)putchar('x');
  182. else if(ans[i]<0)printf("(x%d)",ans[i]);
  183. else printf("(x+%d)",ans[i]);
  184. }
  185. puts("");
  186. }
  187. }
  188. return 0 ;
  189. }

  

终于过了,我还以为是用+作分隔符呢。看了别人的才发现不是的,被题目坑了一晚。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cctype>
  5. #include <algorithm>
  6. #include <vector>
  7. using namespace std;
  8.  
  9. struct Multi{
  10. int coef[10];
  11. int len_pow;
  12. void init(){
  13. len_pow=-1;
  14. memset(coef,0,sizeof(coef));
  15. }
  16. };
  17. Multi f,g;
  18.  
  19. char str[150],ts[150];
  20. vector<int>ans;
  21. int c[6];
  22. bool dig(char x){return x>='0'&&x<='9';}
  23.  
  24. void deal(char s[]){
  25. int tmp,p,i;
  26. memset(c,0,sizeof(c));
  27. int len=strlen(s);
  28. int left,right;
  29. for(i=0;i<len;i++)
  30. {
  31. if(s[i]=='x')
  32. {
  33. //¼ÆËãÓбß
  34. if(s[i+1]=='^')
  35. {
  36. right=i+2;
  37. p=s[right]-'0';//×î¶àÊÇ5£¬È¡1Ϊ¾ÍÐÐÁË
  38. }
  39. else
  40. {
  41. right=i;
  42. p=1;
  43. }
  44.  
  45. int ten=1;
  46.  
  47. left=i-1;
  48. tmp=0;
  49. while(left>=0&&dig(s[left]))
  50. {
  51. tmp+=(s[left]-'0')*ten;
  52. ten*=10;
  53. left--;
  54. }
  55.  
  56. if(tmp==0)tmp++;
  57.  
  58. if(left>=0&&s[left]=='-')
  59. {
  60. tmp=-tmp;
  61. left--;
  62. }
  63.  
  64. c[p]+=tmp;
  65.  
  66. for(left++;left<=right;left++)
  67. {
  68. s[left]=1;
  69. }
  70. }
  71. }
  72. //puts("zz");
  73. for(i=0;i<len;i++)//Çóʣϵij£Êý
  74. {
  75. if(s[i]=='-'||dig(s[i]))
  76. {
  77. int sign=1;
  78. tmp=0;
  79. if(s[i]=='-')
  80. {
  81. sign=-1;
  82. i++;
  83. }
  84. while(i<len&&dig(s[i]))
  85. {
  86. tmp=tmp*10+s[i]-'0';
  87. i++;
  88. }
  89. i--;
  90. c[0]+=tmp*sign;
  91. }
  92. }
  93. }
  94.  
  95. bool Div(int k){
  96. g.init();
  97. for(int i=f.len_pow;i>=1;i--){
  98. g.coef[i-1]=f.coef[i]-k*g.coef[i];
  99. // if(k==-1) cout<<i-1<<" "<<g.coef[i-1]<<" "<<k<<endl;
  100. }
  101. for(g.len_pow=f.len_pow-1;g.len_pow>=0;g.len_pow--)
  102. if(g.coef[g.len_pow]) break;
  103. if(g.coef[0]*k!=f.coef[0]) return false;
  104. if(g.len_pow>=0&&g.coef[g.len_pow]!=1) return false;
  105. f=g;
  106. if(f.len_pow==0&&f.coef[f.len_pow]==1) f.len_pow=-1;
  107. return true;
  108. }
  109.  
  110. bool slove(){
  111. ans.clear();
  112. while(f.coef[0]==0&&f.len_pow>=0){
  113. ans.push_back(0);
  114. for(int i=0;i<f.len_pow;i++){
  115. f.coef[i]=f.coef[i+1];
  116. }
  117. f.coef[f.len_pow]=0;
  118. f.len_pow--;
  119. }
  120. // if(f.len_pow<0) return false;
  121. if(f.len_pow==0) return true;
  122. for(int i=-1000;i<=1000;i++){
  123. if(i==0) continue;
  124. if(i!=0&&f.coef[0]%i!=0) continue;
  125. if(Div(i)){
  126. ans.push_back(i);
  127. i--;
  128. if(f.len_pow==-1) return true;
  129. }
  130. }
  131. return false;
  132. }
  133.  
  134. int main(){
  135. int T,t=0;
  136. scanf("%d",&T);
  137. while(T--){
  138. scanf("%s",str);
  139. /* char *p;
  140. p=strtok(str,"+");
  141. f.init();
  142. /* while(p){
  143. strcpy(ts,p);
  144. deal(ts);
  145. p=strtok(NULL,"+");
  146. }*/
  147. f.init();
  148. deal(str);
  149. memcpy(f.coef,c,sizeof(c));
  150. for(int i=5;i>=0;i--)
  151. if(f.coef[i]){
  152. f.len_pow=i;
  153. break;
  154. }
  155. printf("Case #%d: ",++t);
  156. if(f.coef[f.len_pow]!=1){
  157. puts("-1");
  158. continue;
  159. }
  160. // for(int i=0;i<=5;i++) cout<<i<<" "<<f.coef[i]<<endl;
  161. bool flag=slove();
  162. if(!flag) { puts("-1"); continue;}
  163. sort(ans.begin(),ans.end());
  164. for(int i=0;i<ans.size();i++)
  165. if(ans[i]==0)
  166. printf("x");
  167. else if(ans[i]>0)
  168. printf("(x+%d)",ans[i]);
  169. else printf("(x%d)",ans[i]);
  170. puts("");
  171. }
  172. return 0;
  173. }

  

HDU 4516的更多相关文章

  1. poj和hdu部分基础算法分类及难度排序

    最近想从头开始刷点基础些的题,正好有个网站有关于各大oj的题目分类(http://www.pythontip.com/acm/problemCategory),所以写了点脚本把hdu和poj的一些题目 ...

  2. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  4. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  5. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  6. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  7. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

  8. hdu 4481 Time travel(高斯求期望)(转)

    (转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...

  9. HDU 3791二叉搜索树解题(解题报告)

    1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...

随机推荐

  1. Android内存管理(12)*「实例」用Monitor 生成.hprof文件 并分析内存泄漏

    参考 http://blog.csdn.net/xiaanming/article/details/42396507 基本步骤: 1,准备一个有内存泄漏的代码 2,如何发现内存泄漏 3,生成.hpro ...

  2. Spark RDD/Core 编程 API入门系列之简单移动互联网数据(五)

    通过对移动互联网数据的分析,了解移动终端在互联网上的行为以及各个应用在互联网上的发展情况等信息. 具体包括对不同的应用使用情况的统计.移动互联网上的日常活跃用户(DAU)和月活跃用户(MAU)的统计, ...

  3. Android 8.0 启动后台service 出错 IllegalStateException: Not allowed to start service Intent

    错误原因: Android 8.0 不再允许后台service直接通过startService方式去启动, 具体行为变更如下: 如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况 ...

  4. Android彻底组件化demo发布

    今年6月份开始,我开始负责对"得到app"的android代码进行组件化拆分,在动手之前我查阅了很多组件化或者模块化的文章,虽然有一些收获,但是很少有文章能够给出一个整体且有效的方 ...

  5. MFC SkinMagic使用方法

    皮肤库下载地址 https://pan.baidu.com/s/1IuiYlFUJIi-TS9Cgz3M6RA 1.创建MFC工程 2.然后把corona.smf.SkinMagic.dll.Skin ...

  6. 移动web——touch事件介绍

    基本概念 1.在移动web端点击事件或者滑动屏幕.捏合等动作都是由touchstar.touchmove.touchend这三个事件组合在一起使用的 2.click事件在移动端会有0.2秒的延迟,下面 ...

  7. ARM处理器的寄存器,ARM与Thumb状态,7中运行模式

     ** ARM处理器的寄存器,ARM与Thumb状态,7中运行模式  分类: 嵌入式 ARM处理器工作模式一共有 7 种 : USR  模式    正常用户模式,程序正常执行模式 FIQ模式(Fast ...

  8. java 类名.this

    类名为this的限定词. 相对于内部类:有多个this: 1.内部类本身的this: 2.内部类的环境类的this: 类名.this,就是为了对这些this指针的指向做出限定. 区别于类名.class ...

  9. Eclipse中自动生成get/set时携带注释给get/set

    Eclipse中自动生成get/set时携带注释给get/set   编码的时候通常要用到 JavaBean ,而在我们经常把注释写在字段上面,但生成的Get/Set方法不会生成,通过修改Eclips ...

  10. ionic错误

    1. 问题:Error: read ECONNRESET 启动使用ionic serve启动服务器之后只要一刷新界面就会导致服务器关闭,报的错误如下: events.js:136 throw er; ...