kmjp's blog

競技プログラミング参加記です

TopCoder SRM 751 Div1 Easy Hyperbox

出てたらMediumをしょうもないミスで落としてるところだった。
https://community.topcoder.com/stat?c=problem_statement&pm=15313

問題

各辺の長さが正整数の4次元超直方体のうち、表体積の総和がVとなる辺の組み合わせは何通りか。

解法

4辺の長さを短い順にa,b,c,dとすると、表体積は2(abc+abd+acd+bcd)=2*(abc+(ab+bc+ca)d)となる。
a,b,cを総当たりし、dとしてc以上の整数を取りうるかチェックしよう。
a,b,cの総当たりは適度に枝刈りしないとTLEする。

class Hyperbox {
	public:
	int count(int volume) {
		if(volume%2) return 0;
		ll V=volume/2;
		
		ll ret=0;
		for(ll a=1;4*a*a*a<=V;a++) {
			for(ll b=a;4*a*b*b<=V;b++) {
				for(ll c=b;a*c*c+b*c*c<=V;c++) {
					ll X=a*b*c;
					ll Y=(a*b+b*c+c*a);
					if((V-X)%Y) continue;
					ll d=(V-X)/Y;
					if(d>=c) ret++;
				}
			}
		}
		return ret;
	}
}

まとめ

最初任意次元で答えるのかと思って頭を抱えてしまった。