結果
| 問題 |
No.389 ロジックパズルの組み合わせ
|
| コンテスト | |
| ユーザー |
cormoran
|
| 提出日時 | 2016-11-08 17:51:23 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 28 ms / 2,000 ms |
| コード長 | 2,063 bytes |
| コンパイル時間 | 1,419 ms |
| コンパイル使用メモリ | 163,744 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-25 04:55:31 |
| 合計ジャッジ時間 | 4,507 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 99 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
using ll = long long;
#define rep(i, j) for(int i=0; i < (int)(j); i++)
#define all(v) v.begin(),v.end()
class ModInt{
public:
static const ll MOD = 1000000007LL;
ll x;
ModInt():x(0){};
ModInt(ll x){
while(x < 0) x += MOD;
x %= MOD;
this->x = x;
}
ModInt& operator += (const ModInt &l){ x += l.x; if( x >= MOD) x -= MOD; return *this; }
ModInt& operator -= (const ModInt &l){ x -= l.x; if( x < 0 ) x += MOD; return *this; }
ModInt& operator *= (const ModInt &l){ x = (x * l.x) % MOD; return *this; }
ModInt operator +(const ModInt &l) const { return ModInt( x + l.x); }
ModInt operator -(const ModInt &l) const { return ModInt( x - l.x); }
ModInt operator *(const ModInt &l) const { return ModInt( x * l.x); }
};
// @warning rの部分はmodとってはいけない
ModInt pow(const ModInt &n, ll r){
if(r == 0) return ModInt(1);
ModInt ret = pow(n, r / 2);
ret *= ret;
if(r % 2 != 0) ret = ret * n;
return ret;
}
// @waring nはMODと互いに素
ModInt inverse(const ModInt &n){
return pow(n, ModInt::MOD - 2);
}
ModInt factorial(ll n){
ModInt ret(1);
do {
ret *= n;
} while(--n > 0);
return ret;
}
ostream& operator << (std::ostream& os,const ModInt& a){ os << a.x; return os;}
istream& operator >> (std::istream& is,ModInt& a){ is >> a.x; return is;}
class Solver {
public:
bool solve() {
int M; cin >> M;
vector<int> H; {
int a;
while(cin >> a) H.push_back(a);
}
int N = H.size();
int left = M - accumulate(all(H), 0) - (N - 1);
if(left < 0) cout << "NA" << endl;
else if((N == 1 and H[0] == 0) or left == 0) cout << 1 << endl;
else cout << factorial(N + left) * inverse(factorial(left) * factorial(N)) << endl;
return 0;
}
};
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
Solver s;
s.solve();
return 0;
}
cormoran