結果
問題 | No.502 階乗を計算するだけ |
ユーザー | anta |
提出日時 | 2017-04-07 22:29:13 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 11 ms / 1,000 ms |
コード長 | 15,233 bytes |
コンパイル時間 | 2,335 ms |
コンパイル使用メモリ | 177,896 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-07-16 00:55:31 |
合計ジャッジ時間 | 3,779 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,940 KB |
testcase_02 | AC | 2 ms
6,944 KB |
testcase_03 | AC | 2 ms
6,944 KB |
testcase_04 | AC | 2 ms
6,940 KB |
testcase_05 | AC | 2 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,944 KB |
testcase_07 | AC | 2 ms
6,944 KB |
testcase_08 | AC | 2 ms
6,940 KB |
testcase_09 | AC | 2 ms
6,940 KB |
testcase_10 | AC | 2 ms
6,940 KB |
testcase_11 | AC | 2 ms
6,940 KB |
testcase_12 | AC | 2 ms
6,940 KB |
testcase_13 | AC | 2 ms
6,944 KB |
testcase_14 | AC | 2 ms
6,940 KB |
testcase_15 | AC | 2 ms
6,940 KB |
testcase_16 | AC | 2 ms
6,940 KB |
testcase_17 | AC | 2 ms
6,944 KB |
testcase_18 | AC | 2 ms
6,944 KB |
testcase_19 | AC | 2 ms
6,940 KB |
testcase_20 | AC | 2 ms
6,940 KB |
testcase_21 | AC | 1 ms
6,948 KB |
testcase_22 | AC | 6 ms
6,940 KB |
testcase_23 | AC | 3 ms
6,944 KB |
testcase_24 | AC | 4 ms
6,940 KB |
testcase_25 | AC | 2 ms
6,944 KB |
testcase_26 | AC | 4 ms
6,944 KB |
testcase_27 | AC | 3 ms
6,940 KB |
testcase_28 | AC | 3 ms
6,940 KB |
testcase_29 | AC | 2 ms
6,940 KB |
testcase_30 | AC | 6 ms
6,940 KB |
testcase_31 | AC | 3 ms
6,944 KB |
testcase_32 | AC | 2 ms
6,940 KB |
testcase_33 | AC | 11 ms
6,940 KB |
testcase_34 | AC | 7 ms
6,940 KB |
testcase_35 | AC | 11 ms
6,944 KB |
testcase_36 | AC | 7 ms
6,940 KB |
testcase_37 | AC | 11 ms
6,948 KB |
testcase_38 | AC | 3 ms
6,940 KB |
testcase_39 | AC | 5 ms
6,944 KB |
testcase_40 | AC | 9 ms
6,940 KB |
testcase_41 | AC | 2 ms
6,940 KB |
testcase_42 | AC | 2 ms
6,940 KB |
testcase_43 | AC | 2 ms
6,940 KB |
testcase_44 | AC | 2 ms
6,940 KB |
testcase_45 | AC | 2 ms
6,944 KB |
testcase_46 | AC | 2 ms
6,940 KB |
testcase_47 | AC | 2 ms
6,940 KB |
testcase_48 | AC | 2 ms
6,944 KB |
testcase_49 | AC | 2 ms
6,944 KB |
testcase_50 | AC | 2 ms
6,940 KB |
testcase_51 | AC | 2 ms
6,944 KB |
ソースコード
#include "bits/stdc++.h" using namespace std; #define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i)) #define rer(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i)) #define reu(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i)) static const int INF = 0x3f3f3f3f; static const long long INFL = 0x3f3f3f3f3f3f3f3fLL; typedef vector<int> vi; typedef pair<int, int> pii; typedef vector<pair<int, int> > vpii; typedef long long ll; template<typename T, typename U> static void amin(T &x, U y) { if (y < x) x = y; } template<typename T, typename U> static void amax(T &x, U y) { if (x < y) x = y; } template<int MOD> struct ModInt { static const int Mod = MOD; unsigned x; ModInt() : x(0) { } ModInt(signed sig) { int sigt = sig % MOD; if (sigt < 0) sigt += MOD; x = sigt; } ModInt(signed long long sig) { int sigt = sig % MOD; if (sigt < 0) sigt += MOD; x = sigt; } int get() const { return (int)x; } ModInt &operator+=(ModInt that) { if ((x += that.x) >= MOD) x -= MOD; return *this; } ModInt &operator-=(ModInt that) { if ((x += MOD - that.x) >= MOD) x -= MOD; return *this; } ModInt &operator*=(ModInt that) { x = (unsigned long long)x * that.x % MOD; return *this; } ModInt &operator/=(ModInt that) { return *this *= that.inverse(); } ModInt operator+(ModInt that) const { return ModInt(*this) += that; } ModInt operator-(ModInt that) const { return ModInt(*this) -= that; } ModInt operator*(ModInt that) const { return ModInt(*this) *= that; } ModInt operator/(ModInt that) const { return ModInt(*this) /= that; } ModInt inverse() const { signed a = x, b = MOD, u = 1, v = 0; while (b) { signed t = a / b; a -= t * b; std::swap(a, b); u -= t * v; std::swap(u, v); } if (u < 0) u += Mod; ModInt res; res.x = (unsigned)u; return res; } }; template<int MOD> ModInt<MOD> operator^(ModInt<MOD> a, unsigned long long k) { ModInt<MOD> r = 1; while (k) { if (k & 1) r *= a; a *= a; k >>= 1; } return r; } typedef ModInt<1000000007> mint; int digitsMod(char s[], int n, int m) { int x = 0; long long pow10 = 1; for (int i = n - 1; i >= 0; i --) { if ((x += pow10 * (s[i] - '0') % m) >= m) x -= m; pow10 = pow10 * 10 % m; } return x; } template<typename T, int VALUES> T computeWithUmekomi(const T(&ume)[VALUES], unsigned long long N, unsigned interval = 1U << 24) { unsigned long long idx = N / interval; if (idx >= VALUES) { cerr << "computeWithUmekomi: N >= " << interval * VALUES << endl; idx = VALUES - 1; } T t = ume[idx]; unsigned i = (unsigned)(N - idx * interval); while (i > 0) { t.step(); i --; } return t; } struct FactorialMotInt { int i; mint cnt; static FactorialMotInt init() { FactorialMotInt t = { 0, 1 }; return t; } inline void step() { cnt *= ++ i; } friend ostream &operator<<(ostream &o, const FactorialMotInt &t) { return o << "{" << t.i << "," << t.cnt.get() << "}"; } mint get() const { return cnt; } }; struct FactorialMotInt ume[501] = { { 0,1 },{ 2000000,578095319 },{ 4000000,259081142 },{ 6000000,316220877 },{ 8000000,251368199 },{ 10000000,682498929 },{ 12000000,95936601 },{ 14000000,167332441 }, { 16000000,336060741 },{ 18000000,626497524 },{ 20000000,491101308 },{ 22000000,565768255 },{ 24000000,968999 },{ 26000000,638587686 },{ 28000000,19426633 },{ 30000000,76479948 }, { 32000000,842267748 },{ 34000000,485348706 },{ 36000000,544075857 },{ 38000000,798967520 },{ 40000000,723816384 },{ 42000000,721996174 },{ 44000000,323604647 },{ 46000000,398699886 }, { 48000000,294587621 },{ 50000000,67347853 },{ 52000000,196447201 },{ 54000000,228338256 },{ 56000000,762479457 },{ 58000000,811667359 },{ 60000000,27368307 },{ 62000000,59469516 }, { 64000000,766196482 },{ 66000000,86609485 },{ 68000000,340941507 },{ 70000000,625544428 },{ 72000000,808412394 },{ 74000000,585237443 },{ 76000000,361786913 },{ 78000000,595143852 }, { 80000000,199888908 },{ 82000000,579691190 },{ 84000000,459188207 },{ 86000000,439729802 },{ 88000000,899297830 },{ 90000000,888050723 },{ 92000000,736550105 },{ 94000000,85990869 }, { 96000000,56305184 },{ 98000000,168891766 },{ 100000000,927880474 },{ 102000000,934814019 },{ 104000000,567277637 },{ 106000000,44930135 },{ 108000000,47401357 },{ 110000000,281863274 }, { 112000000,692636218 },{ 114000000,14235602 },{ 116000000,400295761 },{ 118000000,421835306 },{ 120000000,661224977 },{ 122000000,168203998 },{ 124000000,544064410 },{ 126000000,583967898 }, { 128000000,751231582 },{ 130000000,623534362 },{ 132000000,243276029 },{ 134000000,60050552 },{ 136000000,395891998 },{ 138000000,159554990 },{ 140000000,970055531 },{ 142000000,487998999 }, { 144000000,82104855 },{ 146000000,513365505 },{ 148000000,1559745 },{ 150000000,261384175 },{ 152000000,323214113 },{ 154000000,444090941 },{ 156000000,80729842 },{ 158000000,664989237 }, { 160000000,195888993 },{ 162000000,457882808 },{ 164000000,212938473 },{ 166000000,827544702 },{ 168000000,677711203 },{ 170000000,66404266 },{ 172000000,195290384 },{ 174000000,349551356 }, { 176000000,83489485 },{ 178000000,52167191 },{ 180000000,547665832 },{ 182000000,350016754 },{ 184000000,296269301 },{ 186000000,23015220 },{ 188000000,748566338 },{ 190000000,109838563 }, { 192000000,105574531 },{ 194000000,542432219 },{ 196000000,325636655 },{ 198000000,630621321 },{ 200000000,933245637 },{ 202000000,238971581 },{ 204000000,557301633 },{ 206000000,848952161 }, { 208000000,925152039 },{ 210000000,724691727 },{ 212000000,238087006 },{ 214000000,910291942 },{ 216000000,492237273 },{ 218000000,834860913 },{ 220000000,368925948 },{ 222000000,740594930 }, { 224000000,806047532 },{ 226000000,172115341 },{ 228000000,116261993 },{ 230000000,268838846 },{ 232000000,243624360 },{ 234000000,481661251 },{ 236000000,95182730 },{ 238000000,115435332 }, { 240000000,136026497 },{ 242000000,710729672 },{ 244000000,366384665 },{ 246000000,270239666 },{ 248000000,79874094 },{ 250000000,112390913 },{ 252000000,103056890 },{ 254000000,339464594 }, { 256000000,108312174 },{ 258000000,479334442 },{ 260000000,135498044 },{ 262000000,591048681 },{ 264000000,353339603 },{ 266000000,839849206 },{ 268000000,736265527 },{ 270000000,217544623 }, { 272000000,618898635 },{ 274000000,380858207 },{ 276000000,898554793 },{ 278000000,54062950 },{ 280000000,419363534 },{ 282000000,160398980 },{ 284000000,990918946 },{ 286000000,450718279 }, { 288000000,648991369 },{ 290000000,500780548 },{ 292000000,39052406 },{ 294000000,460373282 },{ 296000000,461415770 },{ 298000000,643638805 },{ 300000000,668123525 },{ 302000000,673464765 }, { 304000000,199866123 },{ 306000000,841799766 },{ 308000000,504962686 },{ 310000000,128487469 },{ 312000000,299172297 },{ 314000000,577786541 },{ 316000000,773206631 },{ 318000000,204355779 }, { 320000000,30977140 },{ 322000000,363172638 },{ 324000000,472935553 },{ 326000000,587220627 },{ 328000000,793270300 },{ 330000000,522049725 },{ 332000000,335416359 },{ 334000000,472012302 }, { 336000000,332139472 },{ 338000000,464599136 },{ 340000000,309058615 },{ 342000000,580204973 },{ 344000000,954840109 },{ 346000000,895609896 },{ 348000000,836813268 },{ 350000000,386027524 }, { 352000000,724205533 },{ 354000000,715247054 },{ 356000000,830567832 },{ 358000000,68409439 },{ 360000000,189239124 },{ 362000000,943653305 },{ 364000000,811056092 },{ 366000000,825132993 }, { 368000000,985084650 },{ 370000000,148528617 },{ 372000000,882148737 },{ 374000000,701445829 },{ 376000000,302177126 },{ 378000000,241107368 },{ 380000000,940567523 },{ 382000000,325334066 }, { 384000000,115312728 },{ 386000000,218129285 },{ 388000000,180002392 },{ 390000000,917084264 },{ 392000000,435327356 },{ 394000000,421623838 },{ 396000000,59883031 },{ 398000000,79716267 }, { 400000000,429277690 },{ 402000000,316486674 },{ 404000000,940338439 },{ 406000000,940524812 },{ 408000000,833550543 },{ 410000000,996164327 },{ 412000000,697611981 },{ 414000000,274192146 }, { 416000000,925347821 },{ 418000000,893732627 },{ 420000000,358655417 },{ 422000000,581830879 },{ 424000000,347046911 },{ 426000000,125354499 },{ 428000000,247662371 },{ 430000000,568392357 }, { 432000000,209244402 },{ 434000000,149586983 },{ 436000000,309134554 },{ 438000000,263053337 },{ 440000000,780072518 },{ 442000000,990826116 },{ 444000000,155569943 },{ 446000000,711553356 }, { 448000000,451373308 },{ 450000000,462639908 },{ 452000000,654611901 },{ 454000000,41815820 },{ 456000000,675258797 },{ 458000000,934281721 },{ 460000000,275105629 },{ 462000000,325912072 }, { 464000000,252551589 },{ 466000000,554917439 },{ 468000000,754363835 },{ 470000000,909210595 },{ 472000000,719566487 },{ 474000000,424989675 },{ 476000000,50590510 },{ 478000000,198768464 }, { 480000000,99199382 },{ 482000000,747407118 },{ 484000000,497196934 },{ 486000000,726997875 },{ 488000000,296229203 },{ 490000000,703397904 },{ 492000000,732868367 },{ 494000000,26031303 }, { 496000000,216665960 },{ 498000000,352946234 },{ 500000000,733333339 },{ 502000000,459878625 },{ 504000000,16634739 },{ 506000000,68718097 },{ 508000000,404206040 },{ 510000000,97830135 }, { 512000000,31131935 },{ 514000000,864326453 },{ 516000000,167831173 },{ 518000000,718498895 },{ 520000000,608823837 },{ 522000000,385388084 },{ 524000000,681756977 },{ 526000000,313132653 }, { 528000000,442795120 },{ 530000000,256141983 },{ 532000000,636578562 },{ 534000000,553033642 },{ 536000000,919273670 },{ 538000000,326686486 },{ 540000000,141827977 },{ 542000000,693305776 }, { 544000000,186576440 },{ 546000000,565456578 },{ 548000000,519397500 },{ 550000000,696628828 },{ 552000000,370732451 },{ 554000000,915265013 },{ 556000000,923043932 },{ 558000000,777901604 }, { 560000000,637939935 },{ 562000000,490676632 },{ 564000000,462528877 },{ 566000000,798895521 },{ 568000000,699767918 },{ 570000000,811575797 },{ 572000000,606870929 },{ 574000000,179111720 }, { 576000000,508038818 },{ 578000000,752550134 },{ 580000000,848924691 },{ 582000000,34629406 },{ 584000000,435904287 },{ 586000000,208184231 },{ 588000000,206330671 },{ 590000000,131772368 }, { 592000000,648711554 },{ 594000000,523696723 },{ 596000000,25058942 },{ 598000000,817928963 },{ 600000000,724464507 },{ 602000000,701453022 },{ 604000000,281230685 },{ 606000000,596949867 }, { 608000000,303076380 },{ 610000000,272814771 },{ 612000000,48824684 },{ 614000000,939889684 },{ 616000000,48527183 },{ 618000000,484458461 },{ 620000000,326159309 },{ 622000000,668422905 }, { 624000000,965656187 },{ 626000000,359960756 },{ 628000000,407934361 },{ 630000000,456152084 },{ 632000000,124804049 },{ 634000000,920251227 },{ 636000000,483924582 },{ 638000000,167087470 }, { 640000000,903466878 },{ 642000000,368114731 },{ 644000000,388728584 },{ 646000000,249153339 },{ 648000000,322908524 },{ 650000000,92255682 },{ 652000000,15570863 },{ 654000000,744158074 }, { 656000000,334326205 },{ 658000000,98349682 },{ 660000000,769795511 },{ 662000000,888146074 },{ 664000000,582627184 },{ 666000000,919419361 },{ 668000000,986708498 },{ 670000000,373745190 }, { 672000000,256853930 },{ 674000000,702823274 },{ 676000000,308186532 },{ 678000000,180350107 },{ 680000000,606241871 },{ 682000000,273712630 },{ 684000000,682189174 },{ 686000000,946867127 }, { 688000000,502371023 },{ 690000000,825871994 },{ 692000000,701506133 },{ 694000000,341779962 },{ 696000000,815463367 },{ 698000000,49187570 },{ 700000000,957939114 },{ 702000000,933376898 }, { 704000000,338121343 },{ 706000000,869630152 },{ 708000000,632627667 },{ 710000000,435887178 },{ 712000000,129621197 },{ 714000000,827722926 },{ 716000000,918513230 },{ 718000000,547838438 }, { 720000000,852304035 },{ 722000000,689189630 },{ 724000000,567033437 },{ 726000000,212842957 },{ 728000000,404149413 },{ 730000000,663307737 },{ 732000000,206282795 },{ 734000000,488906585 }, { 736000000,280700600 },{ 738000000,534279149 },{ 740000000,375297772 },{ 742000000,922377372 },{ 744000000,219932130 },{ 746000000,701050258 },{ 748000000,863002719 },{ 750000000,217598709 }, { 752000000,810551911 },{ 754000000,247844667 },{ 756000000,812283640 },{ 758000000,857241854 },{ 760000000,624148346 },{ 762000000,564827277 },{ 764000000,478982047 },{ 766000000,454039189 }, { 768000000,48562889 },{ 770000000,671734977 },{ 772000000,508831870 },{ 774000000,897162044 },{ 776000000,892168027 },{ 778000000,277714559 },{ 780000000,624500515 },{ 782000000,808691930 }, { 784000000,895205045 },{ 786000000,628829100 },{ 788000000,919717789 },{ 790000000,748510389 },{ 792000000,574455974 },{ 794000000,172096141 },{ 796000000,581418893 },{ 798000000,15391652 }, { 800000000,203191898 },{ 802000000,880691101 },{ 804000000,986598821 },{ 806000000,264688936 },{ 808000000,785804644 },{ 810000000,423951674 },{ 812000000,696623384 },{ 814000000,161960209 }, { 816000000,541120825 },{ 818000000,841656666 },{ 820000000,629786193 },{ 822000000,269571439 },{ 824000000,76770272 },{ 826000000,421943723 },{ 828000000,751040886 },{ 830000000,672850561 }, { 832000000,493689107 },{ 834000000,100228913 },{ 836000000,639655136 },{ 838000000,929893103 },{ 840000000,814362881 },{ 842000000,406024012 },{ 844000000,10065330 },{ 846000000,983737173 }, { 848000000,551060742 },{ 850000000,823845496 },{ 852000000,946421040 },{ 854000000,842203531 },{ 856000000,894247956 },{ 858000000,885362182 },{ 860000000,116667533 },{ 862000000,241427979 }, { 864000000,281804989 },{ 866000000,563796647 },{ 868000000,774625892 },{ 870000000,256473217 },{ 872000000,918860977 },{ 874000000,753513874 },{ 876000000,304644842 },{ 878000000,161362528 }, { 880000000,627655552 },{ 882000000,799289297 },{ 884000000,816701166 },{ 886000000,787113234 },{ 888000000,701220427 },{ 890000000,245795606 },{ 892000000,10475577 },{ 894000000,759404319 }, { 896000000,491466901 },{ 898000000,114495791 },{ 900000000,586445753 },{ 902000000,718623833 },{ 904000000,66547751 },{ 906000000,351472920 },{ 908000000,494166907 },{ 910000000,172114298 }, { 912000000,364380585 },{ 914000000,965683742 },{ 916000000,117483873 },{ 918000000,237120480 },{ 920000000,193781724 },{ 922000000,107141741 },{ 924000000,793307102 },{ 926000000,236455213 }, { 928000000,14162538 },{ 930000000,778983779 },{ 932000000,49389215 },{ 934000000,859637374 },{ 936000000,713258160 },{ 938000000,923333660 },{ 940000000,83868974 },{ 942000000,217298111 }, { 944000000,176966527 },{ 946000000,105359006 },{ 948000000,10430738 },{ 950000000,315103615 },{ 952000000,708233401 },{ 954000000,946149627 },{ 956000000,281329488 },{ 958000000,31503476 }, { 960000000,965785236 },{ 962000000,916291845 },{ 964000000,899946391 },{ 966000000,512634493 },{ 968000000,121000338 },{ 970000000,492741665 },{ 972000000,165393390 },{ 974000000,917041303 }, { 976000000,741626808 },{ 978000000,536841269 },{ 980000000,377329025 },{ 982000000,859917803 },{ 984000000,373451745 },{ 986000000,823495900 },{ 988000000,73146164 },{ 990000000,847549272 }, { 992000000,646654592 },{ 994000000,205951465 },{ 996000000,780882948 },{ 998000000,598245292 },{ 1000000000,698611116 }, }; const int Interval = 2000000; mint factorial(int n) { return computeWithUmekomi(ume, n, Interval).get(); } int main() { long long n; while (~scanf("%lld", &n)) { mint ans = n >= mint::Mod ? 0 : factorial((int)n); printf("%d\n", ans.get()); } return 0; }