2020 CCPC Wannafly Winter Camp Day1 Div.1&2(H 最大公約數)(找規律+大整數乘法)
時間限制:C/C++ 2秒,其他語言4秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
judge:點我跳轉
題目描述
有三個人, ,其中 和 共享了一個神祕的數字 ,已知 。
現在 和 說:“ 的值等於 ”。
不太信任 ,於是想向 確認一下 是否真的等於 。 雖然不想直接把 的值告訴 ,但是 允許 給出一個正整數 (注意 可以大於 ),然後 會回答 。
現在給出 ,你需要幫助 決定這樣的 的取值,使得 一定可以通過 的回答來判斷 有沒有撒謊。如果這樣的 有多個,你需要輸出最小的那個。
輸入描述:
輸入第一行是一個整數 。
對於每組數據,輸入一行兩個整數 。
輸出描述:
對於每組數據,輸出一行一個整數,表示答案。如果滿足條件的 不存在,則輸出 。
示例1
輸入
3
10 1
10 4
10 7
輸出
210
8
7
備註:
輸入的 指的是 告訴 的值,只需要檢驗它對不對就行
題解
題目中的 是遊戲開始前設定的未知數,而 是遊戲時 給出的固定值,那麼 是變量。而備註中說
輸入的 指的是 告訴 的值,只需要檢驗它對不對就行
說明輸入的是 和
我們假設一個數字
那麼 和 是否相等即代表 和 是否相等。
證明:
- 如果 不是 的倍數那麼 一定不能整除 (即 ),而 是 的倍數,所以 ,其一定能整除 (即 ),所以 。
- 如果 是 的倍數且 不等於 ,且 ,那麼 且 所以 。
- 如果 等於 ,則 。
證畢。
綜上所述,這道題的答案就是 。
。
注意題目要用大整數乘法。
代碼
#include<bits/stdc++.h>
using namespace std;
int p[505], n, m, i, j, t, k, l, a[505];
bool vis[505];
void mul(int x) {
int i; // 定義臨時變量 !
for (i = 0; i < l; i++) a[i] *= x;
for (i = 0; i < l; i++) {
a[i + 1] += a[i] / 10;
a[i] %= 10;
}
for (; a[l]; l++) {
a[l + 1] = a[l] / 10;
a[l] %= 10;
}
}
int main() {
//freopen("in.txt", "r", stdin);
n = 500;
for (i = 2; i <= n; i++) { //線篩
if (!vis[i]) p[m++] = i;
for (j = 0; j < m && i*p[j] <= n; j++) {
vis[i*p[j]] = 1;
if (i%p[j] == 0) break;
}
}
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &k);
memset(a, 0, sizeof(a));
a[0] = l = 1;
for (i = 0; i < m && k*p[i] <= n; i++) mul(p[i]);
mul(k);
for (i = l - 1; ~i; i--) printf("%d", a[i]);
puts("");
}
}