2021百度之星初賽第一場 HDU6999
阿新 • • 發佈:2021-08-01
HDU6999
題目大意:
都是中文,應該不用解釋。
我們可以將取模換一種寫法,不妨設\(a\ mod\ c=b\ mod \ c=x\),那麼可以將\(a\)\(,\)\(b\)寫為\(a=k_1c+x\),\(b=k_2c+x\)。\(a\),\(b\)做差,令\(a-b=k_3c\),顯然我們可以通過動態調整\(k_3\)和\(c\)的值來確定最大與最小的\(c\)。
分類討論\(k_3c=0\)與\(k_3c\ne0\)的情況。
\(k_3c\ne0\),當\(k_3c\)為素數時由於\(c>=2\)。則顯然\(k_3=1\)。\(k_3c\)
\(k_3c=0\)時,\(a,b\)相等,則\(c\)最小可取\(2\),最大就取\(a\)本身即可,但需要特判\(a=b=1\)時的情況。
#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <string.h> #include <cmath> #include <deque> #include <vector> #define Lint long long using namespace std; int T, x, y; bool prime(int x) { if (x == 2 || x == 3) return true; for (int i = 2; i * i <= x; ++i) { if (x % i == 0) return false; } return true; } int main() { scanf("%d",&T); while (T--) { scanf("%d%d", &x, &y); int kc = abs(x - y); if(!kc){ if(x==1){ printf("-1 -1\n"); } else{ printf("2 %d\n",x); } continue; } if (kc == 1) { printf("-1 -1\n"); continue; } else { if (prime(kc)) { printf("%d %d\n", kc, kc); } else { for (int i = 2; i; ++i) { if (kc % i == 0) { printf("%d %d\n", i, kc); break; } } } } } return 0; }