HDU 4516
此题不难,但我就是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的更多相关文章
- poj和hdu部分基础算法分类及难度排序
最近想从头开始刷点基础些的题,正好有个网站有关于各大oj的题目分类(http://www.pythontip.com/acm/problemCategory),所以写了点脚本把hdu和poj的一些题目 ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- HDU 1796How many integers can you find(容斥原理)
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 3791二叉搜索树解题(解题报告)
1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...
随机推荐
- PHP流程控制语句(if,foreach,break......)
背景:PHP程序中,必不可少的要用到流程控制语句.这次对于流程控制语句进行一些总结. 条件控制语句和循环控制语句是两种基本的语法结构,它们都是用来控制程序执行流程.也是构成程序的主要语法基础. 一.程 ...
- Storm 入门一:基本知识+网上资源链接
Strom首页:http://storm.apache.org/ 下载地址:http://www.apache.org/dyn/closer.lua/storm/apache-storm-1.1.0/ ...
- Angular——内置指令
内置指令 ng-app 指定应用根元素,至少有一个元素指定了此属性. ng-controller 指定控制器 ng-show控制元素是否显示,true显示.false不显示 ng-hide控制元素是否 ...
- JS——隐式全局变量
在函数中,var声明的是局部变量,不带var的是隐式全局变量 <script> function fn() { var a = b = c = 0;//a是局部变量,b.c是全局变量 va ...
- JAVA和JVM运行原理揭秘
这里和大家简单分享一下JAVA和JVM运行的原理,Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器 ...
- 回顾Google IO 2016 -Keynote【图解】
Google IO大会倒计时进行中~~ 两名演奏者在使用高空“古筝”. 最后5秒倒计时~~~~全场轰动~ 倒计时结束,IO大会正式开始.屏幕中,一个人把纯白的唱片放入唱片机中. 然后欢快的音乐响起,台 ...
- ARX中类型强制转换
比如 克隆 clone, 获得的是一个acrxobject, acrxobject *pobj=pployline->clone(); acdbpolyline *ppoly=acdbpolyl ...
- js移动端 可移动滑块
document.addEventListener('DOMContentLoaded', function() { //动态创建回到首页dom var backDom = document.crea ...
- webstorm_completion
js 使用yarn 安装声明定义文件 @types/xxx koa ==> @types/koa koa-router ==> @types/koa-router 安装webstorm中的 ...
- WING IDE 快捷键
工欲善其事必先利其器,所以我们无论使用什么编译器,都要熟悉一些快捷键. Ctrl+N新建文件 Ctrl+O 打开文件夹 Ctrl+W 关闭当前文件 Ctrl+S 保存文件 Ctrl+shif+S 另存 ...