結果
| 問題 |
No.373 かけ算と割った余り
|
| コンテスト | |
| ユーザー |
dgd1724
|
| 提出日時 | 2016-10-02 18:37:13 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,224 bytes |
| コンパイル時間 | 1,067 ms |
| コンパイル使用メモリ | 100,968 KB |
| 実行使用メモリ | 13,640 KB |
| 最終ジャッジ日時 | 2024-11-21 13:06:39 |
| 合計ジャッジ時間 | 10,563 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 2 TLE * 3 |
ソースコード
#define _USE_MATH_DEFINES //M_PI(π),M_SQRT2(√2)
#include <iostream> //std::cout, std::cin
#include <string> //std::string,std::to_string(C++11)
#include <vector> //std::vector
#include <valarray> //std::valarray
#include <algorithm> //std::sort
#include <ctime> //localtime_s
#include <cstdlib> //abs
#include <cmath> //abs,std::pow,sqrt,sin,cos,round,floor,ceil
#include <fstream> //std::ifstream,std::ofstream
#include <iomanip> //std::setprecision,std::setw,std::setfill
#include <random> //std::random(C++11)
#include <numeric> //std::accumulate
#include <functional> //std::greater
bool Compare_MultiplePrecision(const std::string A, const std::string B) {
if (A == B) {
return true;
}
if (A.length() > B.length()) {
return true;
}
else if (A.length() < B.length()) {
return false;
}
else {
unsigned int i = 0;
while (A[i] == B[i]) {
i++;
}
if (A[i] > B[i]) {
return true;
}
else {
return false;
}
}
}
std::string Subtract_MultiplePrecision(const std::string A, const std::string B) {
int a[100] = {};
int b[100] = {};
int c[200] = {};
for (unsigned int i = 0; i < A.length(); i++) {
a[i] = A[A.length() - 1 - i] - '0';
}
for (unsigned int i = 0; i < B.length(); i++) {
b[i] = B[B.length() - 1 - i] - '0';
}
for (unsigned int i = 0; i < A.length(); i++) {
if (a[i] >= b[i]) {
c[i] = a[i] - b[i];
}
else {
c[i] = a[i] + 10 - b[i];
b[i + 1]++;
}
}
int st = 199;
while (c[st] == 0) {
st--;
}
std::string ans;
for (int i = st; i >= 0; i--) {
ans += std::to_string(c[i]);
}
if (ans == "") {
ans = "0";
}
return ans;
}
std::string Modulo_MultiplePrecision(const std::string A, const std::string B) {
std::string rem = A;
std::string div = B;
while (Compare_MultiplePrecision(rem, div)) {
rem = Subtract_MultiplePrecision(rem, div);
}
return rem;
}
std::string Multiply_MultiplePrecision(const std::string A, const std::string B) {
int a[100] = {};
int b[100] = {};
int c[200] = {};
for (unsigned int i = 0; i < A.length(); i++) {
a[i] = A[A.length() - 1 - i] - '0';
}
for (unsigned int i = 0; i < B.length(); i++) {
b[i] = B[B.length() - 1 - i] - '0';
}
for (unsigned int i = 0; i < B.length(); i++) {
for (unsigned int j = 0; j < A.length(); j++) {
c[i + j] += b[i] * a[j];
}
}
for (unsigned int i = 0; i < A.length() + B.length(); i++) {
c[i + 1] += c[i] / 10;
c[i] = c[i] % 10;
}
int st = 199;
while (c[st] == 0) {
st--;
}
std::string ans;
for (int i = st; i >= 0; i--) {
ans += std::to_string(c[i]);
}
if (ans == "") {
ans = "0";
}
return ans;
}
int main(void) {
//test用
//std::ifstream in("123.txt");
//std::cin.rdbuf(in.rdbuf());
std::string A, B, C, D;
std::cin >> A >> B >> C >> D;
if (A.length() + B.length() + C.length() <= 18) {
unsigned long long a = std::stoi(A);
unsigned long long b = std::stoi(B);
unsigned long long c = std::stoi(C);
unsigned long long d = std::stoi(D);
std::cout << (a*b*c) % d << std::endl;
}
else {
std::string ans;
ans = Multiply_MultiplePrecision(A, B);
ans = Multiply_MultiplePrecision(ans, C);
ans = Modulo_MultiplePrecision(ans, D);
std::cout << ans << std::endl;
}
}
dgd1724