洛谷-3868 【模板】猜数字

这道题目要求找到最小的非负整数n,使得对于两组数字中的任意一对(a_i, b_i),n - a_i能被b_i整除。输入包括两组k个数字,第二组数字两两互素,且题目限制了数字的范围和第二组数字的乘积不超过10^18。解决方案可以通过应用中国剩余定理来实现。" 102363060,8788805,PI升级错误:JNLP文件中JAR资源签名证书不一致解决方案,"['java', 'SAP PI', '软件升级', '故障排除', '系统管理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
现有两组数字,每组k个,第一组中的数字分别为:a1,a2,…,ak表示,第二组中的数字分别用b1,b2,…,bk表示。其中第二组中的数字是两两互素的。求最小的非负整数n,满足对于任意的i,n - ai能被bi整除。
输入格式
输入数据的第一行是一个整数k,(1 ≤ k ≤ 10)。接下来有两行,第一行是:a1,a2,…,ak,第二行是b1,b2,…,bk
输出格式
输出所求的整数n。

输入输出样例
输入 #1
3
1 2 3
2 3 5

输出 #1
23

说明/提示
所有数据中,第一组数字的绝对值不超过109(可能为负数),第二组数字均为不超过6000的正整数,且第二组里所有数的乘积不超过1018
每个测试点时限1秒
注意:对于C/C++语言,对64位整型数应声明为long long,如使用scanf, printf函数(以及fscanf, fprintf等),应采用%lld标识符。

解释:很明显可以转换成中国剩余定理的形式,那就直接上模板把

#include<iostream>
#define ll long long
using namespace std;
ll a[20],b[20];
ll x=0,m=1;
void exgcd(ll a,ll b,ll &x,ll &y){
    if(b==0){ x=1; y=0; return;}
    exgcd(b,a%b,x,y);
    int tp=x;
    x=y; y=tp-a/b*y;
}
ll mul(ll a,ll b){//快速乘
    ll r=0;
    while(b){
        if(b&1) r=(a+r)%m;
        a=(a+a)%m;
        b>>=1;
    }
    return r;
}
int main(){
	int n=0;cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	for(int i=1;i<=n;i++) m*=b[i];
	for(int i=1;i<=n;i++){
		ll t=0,temp=0;
		exgcd(m/b[i],b[i],t,temp);
		t=(t%b[i]+b[i])%b[i];
		x+=mul(mul(a[i],(m/b[i])),t);x%=m;x+=m;x%=m;
	}
	cout<<x<<endl;
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值