結果
問題 | No.500 階乗電卓 |
ユーザー |
![]() |
提出日時 | 2017-04-07 23:08:49 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 2,696 bytes |
コンパイル時間 | 1,456 ms |
コンパイル使用メモリ | 164,972 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-06-25 02:53:08 |
合計ジャッジ時間 | 2,243 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 20 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:135:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 135 | scanf("%lld", &n); | ~~~~~^~~~~~~~~~~~
ソースコード
#include<bits/stdc++.h>#include<unordered_set>#include<unordered_map>using namespace std;long long int n;string cur;void MOD(){reverse(cur.begin(), cur.end());while (cur.size() > 12){cur.pop_back();}reverse(cur.begin(), cur.end());}bool check(){for (int i = 0; i < cur.size(); i++){if (cur[i] == '0'){}else{return false;}}return true;}string pluss(string a, string b, bool flag = false){if (!flag){reverse(a.begin(), a.end());reverse(b.begin(), b.end());}if (a.size() > b.size()){swap(a, b);}string ans;ans.clear();long long int want = 0;for (int i = 0; i < a.size(); i++){long long int val = a[i] - '0';val += b[i] - '0';val += want;want = val / 10LL;val %= 10LL;ans.push_back(val + '0');}for (int j = a.size(); j < b.size(); j++){long long int val = 0;val += b[j] - '0';val += want;want = val / 10LL;val %= 10LL;ans.push_back(val + '0');}while (want){ans.push_back(want % 10 + '0');want /= 10;}if (!flag){reverse(ans.begin(), ans.end());}if (ans.size() == 0)ans = "0";return ans;}string mult(string a, string b, bool flag = false){if (!flag){reverse(a.begin(), a.end());reverse(b.begin(), b.end());}string ans = "0";string pas;string kari;pas.clear();for (int i = 0; i < b.size(); i++){long long int bb = b[i] - '0';long long int tmp = 0;kari = pas;for (int j = 0; j < a.size(); j++){long long int val = (long long int)(a[j] - '0')*bb;val += tmp;tmp = val / 10LL;val %= 10LL;kari.push_back(val + '0');}while (tmp){kari.push_back((tmp % 10LL) + '0');tmp /= 10LL;}ans = pluss(ans, kari, true);//endpas.push_back('0');}if (!flag){reverse(ans.begin(), ans.end());}if (ans.size() == 0)ans = "0";return ans;}string minuss(string a, string b){reverse(b.begin(), b.end());reverse(a.begin(), a.end());while (a.size()>b.size()){b.push_back('0');}while (a.size()<b.size()){a.push_back('0');}bool carry = false;for (int i = 0; i<a.size(); i++){if (a[i] != '0'&&carry){a[i]--;carry = false;}if (a[i] == '0'&&carry){a[i] = '9';}if (a[i] >= b[i]){a[i] = (a[i] - '0') - (b[i] - '0') + '0';}else{a[i] = (10 + (a[i] - '0') - (b[i] - '0')) + '0';carry = true;}}while (a.size()>1 && a.back() == '0'){a.pop_back();}reverse(a.begin(), a.end());return a;}int main(){scanf("%lld", &n);cur = "1";for (long long int i = 2; i <= n; i++){stringstream ss;ss << i;string k;ss >> k;cur = mult(cur, k);MOD();if (check()){break;}}MOD();cout << cur << endl;return 0;}