はまやんはまやんはまやん

hamayanhamayan's blog

四方演算 [yukicoder 864]

https://yukicoder.me/problems/no/864

解説

https://yukicoder.me/submissions/370113

ab + bc + cd + da = Kを変形していく
(ab + da) + (bc + cd) = K
a(b + d) + c(b + d) = K
(a + c)(b + d) = K
となるので、a+c, b+dはKの倍数になる。
なので、Kを2つの積に分解して、aとc, bとdで組み合わせを求めればいい。

あとは、x + y = zであり、1≦x,y≦Nであるx,yの組がわかればいい。
get(z)が条件を満たす組み合わせであるとすると、[1,N]の制約がなければf(z) = z - 1通りである。
z - 1≦Nであるならばすべて条件を満たすし、逆に2N<zであれば条件を満たすものはない。
つまり、
z ≦ N+1ならz-1通り
2N < zなら0通り
N+2≦z≦2Nはわからないが、きっと1個ずつ減るんだろうと仮定すると、
z=2Nなら1なので、2N-z+1であろう。
あとは、z≦1なら0通りなのを追加するとOK

ll N, K;
//---------------------------------------------------------------------------------------------------
ll get(ll x) {
    if (x &lt;= 1) return 0;
    else if (x &lt;= N + 1) return x - 1;
    else if (x &lt;= 2 * N) return 2 * N + 1 - x;
    else return 0;
}
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N >> K;

    auto ed = enumdiv(K);
    ll ans = 0;
    fore(ac, ed) ans += get(ac) * get(K / ac);
    cout &lt;&lt; ans &lt;&lt; endl;
}