Sicily 1020. Big Integer | 大整數取模運算
阿新 • • 發佈:2019-02-15
題目:
•題意:輸入n個整數bi(1 <= i <= n),以及一個大整
數x,輸出一個n元組(x mod b1,x mod b2,…,x
mod bn)
• 約束: n <= 100, 1 < bi <= 1000 (1 <= i <= n) 大整數x的位數
m <= 400並且非負
思路:
• mod 操作(對應C++中的%操作符)的性質:
• (a + b) % n == (a % n + b % n) % n
• (a * b) % n == ((a % n) * (b % n)) % n
• 所以我們要儲存的值都是在模意義下的
• 大整數處理的常用辦法
• 例如: 1234=(((1 * 10 + 2) * 10 + 3) * 10) + 4
• 再利用前面mod操作的性質我們可以知道:
• 1%7 = 1
• 12%7 = (((1 % 7) * 10) % 7 + 2) % 7 = 5
• 123%7 = (((12 % 7) * 10) % 7 + 3) % 7 = 4
• 1234%7 = (((123 % 7) * 10) % 7 + 4) % 7 = 2
程式碼:
// Problem#: 1020
// Submission#: 4531242
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int b[1010];
int mod(string s, int n)
{
int len = s.length();
int res = 0;
for (int i = 0; i < len; i++)
{
res =( (res*10) % n + s[i] -'0') % n;
}
return res;
}
int main()
{
int testcase;
int num;
cin >> testcase;
string str;
while(testcase--)
{
cin >> num;
for(int i = 1; i <= num; i++)
{
cin >> b[i];
}
cin >> str;
cout << "(";
for(int i = 1; i < num; i++)
{
cout << mod(str,b[i]) << ",";
}
cout << mod(str, b[num]) << ")" << endl;
}
}