読者です 読者をやめる 読者になる 読者になる

メモ

yukicoderで遊んでいる競プロゆるふわ勢

yukicoder No.40 多項式の割り算

問題はこちら
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);}