問題はこちら
No.40 多項式の割り算 - yukicoder
上の次数から割り算をしていくだけ
筆算を思い浮かべれば分かるように、x^3-xで割ると
最高次数の係数を2つ下の次数に足していくことになる
サンプルに挙げられている例では(右が高次なことに注意)
0 -5 0 4 0 1 -1 0 1
0 -5 0 4 0 1 0 0 0
0 -5 0 5 0 0 0 0 0
0 0 0 0 0 0 0 0 0
と計算が進む。ただし x^2-1 をうっかり0にしないように注意
int main(){ int n,a[100001],i; scanf("%d",&n); for(i=0;i<=n;i++)scanf("%d",a+i); for(;n>2;n--)a[n-2]+=a[n]; if(a[2])printf("2\n%d %d %d",a[0],a[1],a[2]); else if(a[1])printf("1\n%d %d",a[0],a[1]); else printf("0\n%d",a[0]); return 0; }
最初の変数はいらないので配列にまとめて読み込んでしまう
出力をちょっとだけ工夫してみる
a[10010],n,j,x; main(){ for(;~scanf("%d",a+n);n++); for(;--n>3;)a[n-2]+=a[n]; printf("%d\n",n=a[3]?2:!!a[2]); for(;x=j++<=n;printf("%d ",a[j])); }
printfを1つにしたいので for(;何か;)printf("%d%c",何か,何か?10:32); の形に持っていく
a[10010],n,x; main(j){ for(;~scanf("%d",a+n++);); for(;--n>3;)a[n-2]+=a[n]; for(;x=n-~j--;printf("%d%c",!j?n=a[3]?2:!!a[2]:a[-j],j?32:10)); }
最後にループを圧縮して
a['~~'],n; main(j){ for(;~scanf("%d",a+n)?++n:n>3?a[n-2]+=a[n],n--:n-~j--?printf("%d%c",!j?n=a[3]?2:!!a[2]:a[-j],j?32:10):0;); }
REにはならないらしい。125B
こんな感じの124Bも考えたけど、こちらはRE
a['~~'],i; f(n){ ~scanf("%d",a+n)?f(n+1):0; n>3?a[n-2]+=a[n]:i|a[n]|n==1&&printf("%d%c",!i++?n-1:a[i-1],i?32:10); } main(){f(0);}