結果
| 問題 |
No.823 Many Shifts Easy
|
| コンテスト | |
| ユーザー |
bal4u
|
| 提出日時 | 2019-09-11 12:07:28 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 4 ms / 2,000 ms |
| コード長 | 983 bytes |
| コンパイル時間 | 206 ms |
| コンパイル使用メモリ | 30,848 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-02 16:44:41 |
| 合計ジャッジ時間 | 933 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
ソースコード
// yukicoder 823 Many Shifts Easy
// 2019.9.11 bal4u
#include <stdio.h>
typedef long long ll;
#define MOD 1000000007
#define MAX 100000
int fact[MAX+2] = {1,1};
int inv[MAX+2] = {1,1};
int invfact[MAX+2] = {1,1};
void init() {
int i;
for (i = 2; i <= MAX; i++) {
fact[i] = (ll)fact[i-1]*i % MOD;
inv[i] = -(MOD/i)*(ll)inv[MOD%i] % MOD; // マイナスになることも
invfact[i] = (ll)invfact[i-1]*inv[i] % MOD;
}
}
int nPk(int n, int k) { // 順列
if (n < 0 || k < 0 || n < k) return 0;
return (ll)fact[n] * invfact[n-k] % MOD;
}
int nCk(int n, int k) { // 組合せ
if (n < 0 || k < 0 || n < k) return 0;
if (k == 0) return 1;
return (ll)fact[n] * invfact[k] % MOD * invfact[n-k] % MOD;
}
int main()
{
int N, K, ans;
scanf("%d%d", &N, &K);
init();
ans = (ll)N*(N+1)/2 % MOD * nPk(N-1, K) % MOD +
(ll)N*(N-1)/2 % MOD * nCk(N-2, K-2) % MOD * fact[K] % MOD * invfact[2] % MOD;
if (ans < 0) ans += MOD;
printf("%d\n", ans);
return 0;
}
bal4u