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

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

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

)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <vector>
using namespace std; struct Multi{
int coef[10];
int len_pow;
void init(){
len_pow=-1;
memset(coef,0,sizeof(coef));
}
};
Multi f,g; char str[150],ts[150];
vector<int>ans; void deal(char s[]){
int index=0,len=strlen(s);
for(index;index<len;index++){
if(s[index]=='x')
break;
}
int cof=0,sig=1;
for(int i=0;i<index;i++){
if(s[i]=='-') sig=-1;
else{
cof=cof*10+s[i]-'0';
}
}
if(cof==0) cof=1;
cof=cof*sig;
int _pow=0;
for(int i=index+2;i<len;i++){
_pow=_pow*10+s[i]-'0';
}
if(_pow==0&&index!=len) _pow=1;
f.coef[_pow]+=cof;
} bool Div(int k){
g.init();
for(int i=f.len_pow;i>=1;i--){
g.coef[i-1]=f.coef[i]-k*g.coef[i];
// if(k==-1) cout<<i-1<<" "<<g.coef[i-1]<<" "<<k<<endl;
}
for(g.len_pow=f.len_pow-1;g.len_pow>=0;g.len_pow--)
if(g.coef[g.len_pow]) break;
if(g.coef[0]*k!=f.coef[0]) return false;
if(g.len_pow>=0&&g.coef[g.len_pow]!=1) return false;
f=g;
if(f.len_pow==0&&f.coef[f.len_pow]==1) f.len_pow=-1;
return true;
} bool slove(){
ans.clear();
while(f.coef[0]==0&&f.len_pow>=0){
ans.push_back(0);
for(int i=0;i<f.len_pow;i++){
f.coef[i]=f.coef[i+1];
}
f.coef[f.len_pow]=0;
f.len_pow--;
}
// if(f.len_pow<0) return false;
if(f.len_pow==0) return true;
for(int i=-1000;i<=1000;i++){
if(i==0) continue;
if(i!=0&&f.coef[0]%i!=0) continue;
if(Div(i)){
ans.push_back(i);
i--;
if(f.len_pow==-1) return true;
}
}
return false;
} int main(){
int T,t=0;
scanf("%d",&T);
while(T--){
scanf("%s",str);
char *p;
p=strtok(str,"+");
f.init();
while(p){
strcpy(ts,p);
deal(ts);
p=strtok(NULL,"+");
}
for(int i=5;i>=0;i--)
if(f.coef[i]){
f.len_pow=i;
break;
}
printf("Case #%d: ",++t);
if(f.len_pow<0){
puts("-1");
continue;
}
if(f.coef[f.len_pow]!=1){
puts("-1");
continue;
}
// for(int i=0;i<=5;i++) cout<<i<<" "<<f.coef[i]<<endl;
bool flag=slove();
if(!flag) { puts("-1"); continue;}
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++)
if(ans[i]==0)
printf("x");
else if(ans[i]>0)
printf("(x+%d)",ans[i]);
else printf("(x%d)",ans[i]);
puts("");
}
return 0;
}

  

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

#include<stdio.h>
#include<string.h>
#include<algorithm> using namespace std ;
const int MAX=110;
const int INF=100000000;
char s[MAX];
int c[6];
struct BigNum
{
int dig[6];
int len;
void clr()
{
len=1;
memset(dig,0,sizeof(dig));
}
}; bool dig(char x){return x>='0'&&x<='9';}
BigNum f;
BigNum Div(BigNum a,int b)
{
int i;
int t;
BigNum ret;
ret.clr();
for(i=a.len-1;i>=1;i--)
{
t=a.dig[i];
ret.dig[i-1]+=t;
a.dig[i]=0;
a.dig[i-1]-=b*t;
}
ret.len=-1;
if(a.dig[0]!=0)return ret; for(i=5;i>=0&&ret.dig[i]==0;i--); ret.len=i+1;
return ret;
}
int calc()
{
int i;
if(f.dig[0]==0)
{
for(i=0;i+1<f.len;i++)
{
f.dig[i]=f.dig[i+1];
}
f.len--;
return 0;
}
for(i=-1000;i<=1000;i++)
{
if(i==0&&f.dig[0]!=0)continue;
else if(i!=0&&f.dig[0]%i!=0)continue; BigNum tmp=Div(f,i);
if(tmp.len==-1)continue;
f=tmp;
return i;
}
return INF;
}
int main ()
{
int T,CS=1;
int len;
int tmp,p;
int i;
scanf("%d",&T);
while (T--)
{
scanf("%s",s);
memset(c,0,sizeof(c));
len=strlen(s);
int left,right;
for(i=0;i<len;i++)
{
if(s[i]=='x')
{
//计算有边
if(s[i+1]=='^')
{
right=i+2;
p=s[right]-'0';//最多是5,取1为就行了
}
else
{
right=i;
p=1;
} int ten=1; left=i-1;
tmp=0;
while(left>=0&&dig(s[left]))
{
tmp+=(s[left]-'0')*ten;
ten*=10;
left--;
} if(tmp==0)tmp++; if(left>=0&&s[left]=='-')
{
tmp=-tmp;
left--;
} c[p]+=tmp; for(left++;left<=right;left++)
{
s[left]=1;
}
}
}
//puts("zz");
for(i=0;i<len;i++)//求剩下的常数
{
if(s[i]=='-'||dig(s[i]))
{
int sign=1;
tmp=0;
if(s[i]=='-')
{
sign=-1;
i++;
}
while(i<len&&dig(s[i]))
{
tmp=tmp*10+s[i]-'0';
i++;
}
i--;
c[0]+=tmp*sign;
}
}
int maxc=5;
while(maxc>=0&&c[maxc]==0)
{
maxc--;
}
printf("Case #%d: ",CS++);
if(maxc<=0)
{
puts("-1");
continue;
}
else if(c[maxc]!=1)
{
puts("-1");
continue;
}
//puts("");for(i=0;i<=maxc;i++)printf("x[%d]=%d\n",i,c[i]);
int ans[6]; f.clr();
memcpy(f.dig,c,sizeof(c));
f.len=maxc+1;
for(i=0;i<maxc;i++)
{
ans[i]=calc();
if(ans[i]==INF)break;
}
if(i<maxc)
{
puts("-1");
}
else
{
sort(ans,ans+maxc);
for(i=0;i<maxc;i++)
{
if(ans[i]==0)putchar('x');
else if(ans[i]<0)printf("(x%d)",ans[i]);
else printf("(x+%d)",ans[i]);
}
puts("");
}
}
return 0 ;
}

  

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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <vector>
using namespace std; struct Multi{
int coef[10];
int len_pow;
void init(){
len_pow=-1;
memset(coef,0,sizeof(coef));
}
};
Multi f,g; char str[150],ts[150];
vector<int>ans;
int c[6];
bool dig(char x){return x>='0'&&x<='9';} void deal(char s[]){
int tmp,p,i;
memset(c,0,sizeof(c));
int len=strlen(s);
int left,right;
for(i=0;i<len;i++)
{
if(s[i]=='x')
{
//¼ÆËãÓбß
if(s[i+1]=='^')
{
right=i+2;
p=s[right]-'0';//×î¶àÊÇ5£¬È¡1Ϊ¾ÍÐÐÁË
}
else
{
right=i;
p=1;
} int ten=1; left=i-1;
tmp=0;
while(left>=0&&dig(s[left]))
{
tmp+=(s[left]-'0')*ten;
ten*=10;
left--;
} if(tmp==0)tmp++; if(left>=0&&s[left]=='-')
{
tmp=-tmp;
left--;
} c[p]+=tmp; for(left++;left<=right;left++)
{
s[left]=1;
}
}
}
//puts("zz");
for(i=0;i<len;i++)//Çóʣϵij£Êý
{
if(s[i]=='-'||dig(s[i]))
{
int sign=1;
tmp=0;
if(s[i]=='-')
{
sign=-1;
i++;
}
while(i<len&&dig(s[i]))
{
tmp=tmp*10+s[i]-'0';
i++;
}
i--;
c[0]+=tmp*sign;
}
}
} bool Div(int k){
g.init();
for(int i=f.len_pow;i>=1;i--){
g.coef[i-1]=f.coef[i]-k*g.coef[i];
// if(k==-1) cout<<i-1<<" "<<g.coef[i-1]<<" "<<k<<endl;
}
for(g.len_pow=f.len_pow-1;g.len_pow>=0;g.len_pow--)
if(g.coef[g.len_pow]) break;
if(g.coef[0]*k!=f.coef[0]) return false;
if(g.len_pow>=0&&g.coef[g.len_pow]!=1) return false;
f=g;
if(f.len_pow==0&&f.coef[f.len_pow]==1) f.len_pow=-1;
return true;
} bool slove(){
ans.clear();
while(f.coef[0]==0&&f.len_pow>=0){
ans.push_back(0);
for(int i=0;i<f.len_pow;i++){
f.coef[i]=f.coef[i+1];
}
f.coef[f.len_pow]=0;
f.len_pow--;
}
// if(f.len_pow<0) return false;
if(f.len_pow==0) return true;
for(int i=-1000;i<=1000;i++){
if(i==0) continue;
if(i!=0&&f.coef[0]%i!=0) continue;
if(Div(i)){
ans.push_back(i);
i--;
if(f.len_pow==-1) return true;
}
}
return false;
} int main(){
int T,t=0;
scanf("%d",&T);
while(T--){
scanf("%s",str);
/* char *p;
p=strtok(str,"+");
f.init();
/* while(p){
strcpy(ts,p);
deal(ts);
p=strtok(NULL,"+");
}*/
f.init();
deal(str);
memcpy(f.coef,c,sizeof(c));
for(int i=5;i>=0;i--)
if(f.coef[i]){
f.len_pow=i;
break;
}
printf("Case #%d: ",++t);
if(f.coef[f.len_pow]!=1){
puts("-1");
continue;
}
// for(int i=0;i<=5;i++) cout<<i<<" "<<f.coef[i]<<endl;
bool flag=slove();
if(!flag) { puts("-1"); continue;}
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++)
if(ans[i]==0)
printf("x");
else if(ans[i]>0)
printf("(x+%d)",ans[i]);
else printf("(x%d)",ans[i]);
puts("");
}
return 0;
}

  

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. javascript 处理链接的多种方式

    在页面中的链接除了常规的方式以外,如果使用javascript,还有很多种方式,下面是一些使用javascript,打开链接的几种方式: 1.使用window的open方法打开链接,这里可是在制定页面 ...

  2. day03_12/13/2016_bean属性的设置之setter方法注入

  3. html5——颜色

    CSS2 1.opacity,可以设置透明度,但是父盒子设置了透明度会影响子盒子 CC3 1.transparent属性,但是不可改变透明值 2.rgba():r--red g--green b--b ...

  4. JS——绑定自定义属性

    1.绑定自定义属性: (1)元素节点.属性或元素节点[属性]绑定的属性不会出现在标签中,setAttribute可以出现在标签中. (2)setAttribute获取不到元素节点.属性形式绑定的属性值 ...

  5. 14、Scala类型参数

    1.泛型类 2.泛型函数 3.上边界Bounds 4.下边界Bounds 5.View Bounds 6.Context Bounds 7.Manifest Context Bounds 8.协变和逆 ...

  6. 在PHP中调用php_ssh实现远程登陆linux服务器并执行shell脚本。

    这个功能主要用于在web端利用程序对远程服务器进行操作,通过PHP_ssh执行shell脚本来实现. 首先要安装php_ssh2组件,linux中centos7下有ssh2源,直接安装.window下 ...

  7. JAVA趣味逻辑算法

    /**已知4位同学中的一位数学考了100分,当小李询问这4位是谁考了100分时,4个人的回答如下: A说:不是我. B说:是C C说:是D. D说:他胡说. 已知三个人说的是真话,一个人说的是假话.现 ...

  8. LVS部分调度算法的适应场景分析

    1.轮叫调度算法(RR)假设所有服务器处理性能均相同,不管服务器的当前连接数和响应速度.该算法相对简单,不适用于服务器组中处理性能不一的情况,而且当请求服务时间变化比较大时,轮叫调度算法容易导致服务器 ...

  9. post发送 ArrayBuffer

    // 用 POST 方法将 ArrayBuffer 发送到服务器 ); var longInt8View = new Uint8Array(myArray); ; i< longInt8View ...

  10. Centos7安装gitlab服务器

    1.先按照官方教程 https://about.gitlab.com/downloads/#centos7 大概内容如下: 1. Install and configure the necessary ...