首页 > 其他 > 详细

洛谷 P3868 [TJOI2009]猜数字

时间:2019-09-23 22:36:49      阅读:169      评论:0      收藏:0      [点我收藏+]

题意简述

给定\(a[1],a[2],\cdots,a[n]\)\(b[1],b[2],\cdots,b[n]\),其中\(b\)中元素两两互素。
求最小的非负整数\(n\),满足对于任意的\(i\)\(n - a[i]\)能被\(b[i]\)整除。

题解思路

变形后用中国剩余定理即可,注意要快速乘。

代码

#include <cstdio>
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll n,x,y,lcm=1,ans;
ll a[15],p[15];
inline ll _mul(ll x,ll y,ll p) {
    ll z=(ld)x/p*y;
    ll res=(ull)x*y-(ull)z*p;
    return (res+p)%p;
}
void exgcd(const ll& a,const ll& b,ll& x,ll& y) {
    if (!b) { x=1; y=0; return; }
    exgcd(b,a%b,x,y);
    ll tmp=y; y=x-(a/b)*y; x=tmp;
}
int main() {
    scanf("%lld",&n);
    for (register int i=1;i<=n;++i) scanf("%lld",&a[i]);
    for (register int i=1;i<=n;++i) scanf("%lld",&p[i]),lcm*=p[i];
    for (register int i=1;i<=n;++i) a[i]=(a[i]%p[i]+p[i])%p[i];
    for (register int i=1;i<=n;++i) {
        ll xx=lcm/p[i]; exgcd(xx,p[i],x,y);
        x=(x%p[i]+p[i])%p[i];
        (ans+=_mul(_mul(x,xx,lcm),a[i],lcm))%=lcm;
    }
    printf("%lld\n",ans);
}

洛谷 P3868 [TJOI2009]猜数字

原文:https://www.cnblogs.com/xuyixuan/p/11574658.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!