結果

問題 No.2120 場合の数の下8桁
ユーザー 259_Momone
提出日時 2022-11-04 22:19:29
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,421 bytes
コンパイル時間 2,490 ms
コンパイル使用メモリ 247,236 KB
最終ジャッジ日時 2025-02-08 17:57:30
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 15 WA * 5
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <bits/extc++.h>
int main() {
using namespace std;
unsigned long M, N;
cin >> M >> N;
unsigned long value{1}, ord_2{}, ord_5{};
if(N > M){
cout << 0 << endl;
return 0;
}
if(2 * N > M)N = M - N;
const auto multiplies{[&value, &ord_2, &ord_5](unsigned long x){
while(x && x % 2 == 0){
++ord_2;
x /= 2;
}
while(x && x % 5 == 0){
++ord_5;
x /= 5;
}
(value *= x) %= 100000000;
}};
const auto divides{[&value, &ord_2, &ord_5](unsigned long x){
while(x && x % 2 == 0){
--ord_2;
x /= 2;
}
while(x && x % 5 == 0){
--ord_5;
x /= 5;
}
(value *= [](unsigned long a, unsigned long n){
unsigned long r{1};
while(n){
if(n & 1)(r *= a) %= 100000000;
(a *= a) %= 100000000;
n /= 2;
}
return r;
}(x, 4999999)) %= 100000000;
}};
for(unsigned long i{}; i < N; ++i){
multiplies(M - i);
divides(i + 1);
}
ord_2 = min(ord_2, 10UL);
ord_5 = min(ord_5, 10UL);
while(ord_2 > 0){
--ord_2;
(value *= 2) %= 100000000;
}
while(ord_5 > 0){
--ord_5;
(value *= 5) %= 100000000;
}
printf("%08lu\n", value);
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0