【UOJ 676】三数同余

【题目描述】:

已知三个正整数 a,b,c。

现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同。

请问满足上述条件的x的最大值是多少?

数据保证x有解。

【输入描述】:

一行,三个正整数a,b,c,两个整数之间用一个空格隔开。

【输出描述】:

一个整数,即满足条件的x的最大值。

【样例输入】:

300 262 205

【样例输出】:

19

【时间限制、数据范围及描述】:

时间:1s 空间:64M

对于 30%的数据:1<a,b,c<10^6

对于100%的数据:1<a,b,c<10^18

复制代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=1000003;
ll a,b,c; 
ll work(ll a,ll b,ll c){
    ll d=max(a,max(b,c));
    for(ll i=d;i>=1;i--)
        if( (a%i==b%i) &&(c%i==b%i) )
        return i;
    return 0;
}

ll gcd(ll a,ll b){
    if(b==0) return a;
    return gcd(b,a%b);
} 
ll maxx(ll a,ll b){
    if(a>b) return a;
    else return b;
}
ll minn(ll a,ll b){
    if(a<b) return a;
    else return b;
}
int main(){
    freopen("resisame.in","r",stdin);
    freopen("resisame.out","w",stdout);
    cin>>a>>b>>c; 
//    if(a<=N && b<=N && c<=N){
//        printf("%lld\n",work(a,b,c));
//        return 0;
//    }
    ll aa=maxx(a,max(b,c));
    ll bb=minn(a,min(b,c));
    ll cc;
    if(a!=aa && a!=bb) cc=a;
    if(b!=aa && b!=bb) cc=b;
    if(c!=aa && c!=bb) cc=c;
    ll ans=gcd(aa-bb,aa-cc);
    printf("%lld",ans);
    //printf("%d %d %d",a%ans,b%ans,c%ans);
    return 0;
}
复制代码

 

posted @   #Cookies#  阅读(443)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示