1. 程式人生 > 其它 >2021百度之星初賽第一場 HDU6999

2021百度之星初賽第一場 HDU6999

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\)

​​不為素數時,顯然最大的\(c\)​​是\(k_3c\)​​,最小的\(c\)​是\(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;
}