C - Reconciled?: AtCoder Beginner Contest 065

問題文

すぬけ君は、犬を N 匹と猿を M 匹飼っています。すぬけ君は、この N+M 匹を一列に並べようと思っています。 文字通り犬猿の仲の犬たちと猿たちを仲直りさせたいすぬけ君は、犬同士、または猿同士が隣り合うところができないように並べようと思っています。 このような並べ方は何通りあるでしょうか。犬と猿は 109+7以上の数を理解できないので、並べ方の個数を109+7で割ったあまりを求めてください。 ただし、犬同士、また猿同士は互いに区別します。また、左右が反転しただけの列も異なる列とみなします。

制約

1≦N,M≦105

結果: WA

#include <iostream>
#include <cstdlib>
 
using namespace std;
typedef long long ll;
const ll NUM = 1000000007;
 
int main(){
    int N, M;
    cin >> N >> M;
    ll result = 1;
 
    if ( abs(N-M) >1) {
        cout << 0 << endl;
        return 0;
    } else if ( N == M){
        for (int i =0; i <N; ++i) {
            if (i =0) {
                result *= ( (N+M) % NUM);
            }
            result *= ( (N-i) % NUM);
        }
        for (int i =0; i <M; ++i) {
            result *= ( (M-i) % NUM);
        }
    } else {
        for (int i =0; i <N; ++i) {
            result *= ( (N-i) % NUM);
        }
        for (int i =0; i <M; ++i) {
            result *= ( (M-i) % NUM);
        }
    }
    
    cout << result << endl;
    
    return 0;
}