結果
問題 | No.129 お年玉(2) |
ユーザー |
![]() |
提出日時 | 2019-05-13 17:30:38 |
言語 | C (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 2 ms / 5,000 ms |
コード長 | 1,248 bytes |
コンパイル時間 | 334 ms |
コンパイル使用メモリ | 31,488 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-28 01:20:38 |
合計ジャッジ時間 | 1,712 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 46 |
ソースコード
// yukicoder: No.129 お年玉(2)// 2019.5.13 bal4u#include <stdio.h>typedef long long ll;#define MOD 1000000000int exgcd(int a, int b, int *x, int *y) {int d;if (b == 0) { *x = 1, *y = 0; return a; }d = exgcd(b, a % b, y, x);*y -= a / b * (*x);return d;}int inverse(int a) {int x, y;exgcd(a, MOD, &x, &y);if (x < 0) x += MOD;return x;}int powmod(int b, int p){int r = 1;while (p) {if (p & 1) r = (ll)r * b % MOD;b = (ll)b * b % MOD;p >>= 1;}return r;}int comb(int n, int k) {int i, a, two = 0, five = 0;int ans = 1, inv = 1;for (i = 0; i < k; i++) {a = n-i;while ((a & 1) == 0) two++, a >>= 1;while (a % 5 == 0) five++, a /= 5;ans = (ll)ans * a % MOD;}for (i = 2; i <= k; i++) {a = i;while ((a & 1) == 0) two--, a >>= 1;while (a % 5 == 0) five--, a /= 5;ans = (ll)ans * inverse(a) % MOD;}ans = (ll)ans * powmod(2, two) % MOD;ans = (ll)ans * powmod(5, five) % MOD;return ans;}int main(){int M, n, ans;long long N;scanf("%lld%d", &N, &M);n = (int)((N/1000) % M);if (n == 0) ans = 1;else if (n == 1 || n == M-1) ans = M;else {if (n > M/2) n = M - n;ans = comb(M, n);}printf("%d\n", ans);return 0;}