2021百度之星初赛第一场 HDU6999

时间:2021-08-01
本文章向大家介绍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;
}

原文地址:https://www.cnblogs.com/nuist-wzy/p/15086845.html