题意:

一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K。

思路:

参考博客:http://www.cnblogs.com/linyujun/p/5199415.html

举个栗子,K%3=2,K%5=3,K%7=2。

我们需要构造这个答案

5×7×inv(5×7,3) % 3 = 1

3×7×inv(3×7,5) % 5 = 1

3×5×inv(3×5,7) % 7 = 1

然后两边同乘你需要的数

2×5×7×inv(5×7,3) % 3 = 2

3×3×7×inv(3×7,5) % 5 = 3

2×3×5×inv(3×5,7) % 7 = 2

a=2×5×7×inv(5×7,3)

b=3×3×7×inv(3×7,5)

c=2×3×5×inv(3×5,7)

那么

a % 3 = 2

b % 5 = 3

c % 7 = 2

其实答案就是a+b+c

因为

a%5 = a%7 = 0 因为a是5的倍数,也是7的倍数

b%3 = b%7 = 0 因为b是3的倍数,也是7的倍数

c%3 = c%5 = 0 因为c是3的倍数,也是5的倍数

所以

(a + b + c) % 3 = (a % 3) + (b % 3) + (c % 3) = 2 + 0 + 0 = 2

(a + b + c) % 5 = (a % 5) + (b % 5) + (c % 5) = 0 + 3 + 0 = 3

(a + b + c) % 7 = (a % 7) + (b % 7) + (c % 7) = 0 + 0 + 2 = 2

但是答案,不只一个,有无穷个,每105个就是一个答案(105 = 3 5 7)

根据计算,答案等于233233%105 = 23

如果题目问你最小的那个答案,那就是23了。

代码:
typedef long long ll;
ll p[110],m[110];
void extgcd(ll a,ll b,ll d,ll &x,ll &y)   //a,b都为正整数
{
    if(b==0){d=a;x=1;y=0;}
    else{extgcd(b,a%b,d,y,x);y=y-x*(a/b);}
}
ll inverse(ll a,ll p)
{
    ll d,x,y;
    extgcd(a,p,d,x,y);
    return (x%p+p)%p;
}
int main()
{
    int n;
    ll mul=1;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%lld%lld",&p[i],&m[i]);
        mul*=p[i];
    }
    ll ans=0;
    for(int i=0;i<n;i++)
    {
        ll temp=mul/p[i];
        ll tp=(inverse(temp,p[i]))%mul;
        temp=(temp*m[i])%mul;
        ans=(ans+(temp*tp)%mul)%mul;
    }
    printf("%lld\n",ans);
    return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

快速取幂法&&矩阵快速幂 Previous
51nod 1073 约瑟夫环 Next