此题不难,但我就是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. Akka源码分析-ask模式

    在我之前的博文中,已经介绍过要慎用Actor的ask.这里我们要分析一下ask的源码,看看它究竟是怎么实现的. 开发时,如果要使用ask方法,必须要引入akka.pattern._,这样才能使用ask ...

  2. JavaScript Date 日期操作

    在前端工程师的道路上,可能有时候需要与时间来打交道,下面我们来看一下日常对日期的操作,今天我们介绍的是Day.js插件 Day.js 是一个轻量的处理时间和日期的 JavaScript 库,和 Mom ...

  3. 【Codeforces827D/CF827D】Best Edge Weight(最小生成树性质+倍增/树链剖分+线段树)

    题目 Codeforces827D 分析 倍增神题--(感谢T*C神犇给我讲qwq) 这道题需要考虑最小生成树的性质.首先随便求出一棵最小生成树,把树边和非树边分开处理. 首先,对于非树边\((u,v ...

  4. 高斯消元_HihoCoderOffer6_03

    题目3 : 图像算子 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在图像处理的技术中,经常会用到算子与图像进行卷积运算,从而达到平滑图像或是查找边界的效果. 假设原图 ...

  5. [转]android 获取 imei号码

    核心代码: Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)) .getDeviceId(); 1.加入权限 在manife ...

  6. MYSQL创建用户和授权方法(测试mysql5.7)

    一.创建用户:  命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指 ...

  7. hibernate annotation 之 一对多、多对一双向外键关联

    假设,一个农场产出多种植物,具体的某一植物产于某一农场. 3 import java.io.Serializable; 4 import java.util.Set; 5 import javax.p ...

  8. Anaconda——Python包管理工具

    Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windows系统,提供了包管理与环境管理的功能 主要用于Python包管理和版本管理. 下载地址:https:/ ...

  9. sql server 大数据跨服务器迁移表数据——使用链接服务器

    1.创建链接服务器(填写链接服务器.远程登录.使用密码) 2.188.188.1.177是远程的 select count(*) from [188.188.1.177].BigDataAnalysi ...

  10. 使用xml实现的增删改查功能

    实体类: package vo; public class Contact { private String id; private String name; private String gende ...