CODEVS.3990.中国余数定理2(CRT)

题目链接
颓了一天 写个模板吧。。
Chinese_Remainder_Theorem: MashiroSky远航休息栈

#include <cstdio>
#include <cctype>
#define gc() getchar()
typedef long long LL;
const int N=13;

LL n,L,R,B[N],m[N];

inline LL read()
{
    LL now=0;register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now;
}
//void Exgcd(LL a,LL b,LL &x,LL &y)
//{
//  if(!b) x=1,y=0;
//  else {
//      Exgcd(b,a%b,x,y);
//      LL t=x; x=y, y=t-a/b*y;
//  }
//}
void Exgcd(LL a,LL b,LL &x,LL &y)
{
    if(!b) x=1, y=0;
    else Exgcd(b,a%b,y,x), y-=a/b*x;
}
void CRT()
{
    LL M=1,res=0,x,y,Mi,ans=0,Min=0;
    for(int i=1; i<=n; ++i) M*=m[i];
    for(int i=1; i<=n; ++i)
    {
        Mi=M/m[i], Exgcd(Mi,m[i],x,y);
        x=(x%m[i]+m[i])%m[i];
//      if(!x) x=m[i];
        res+=B[i]*Mi*x;
    }
    res%=M;
    if(!res) res=M;
    if(res<=R) ans=(R-res)/M+1;//[res,R]中解的个数 //res就是最小正整数解了,>R显然[L,R]无解(L,R>0)
    if(res<=L) ans-=(L-res)/M+1;//[res,L](res<=L)中解的个数  注意这里=L也要计算(减掉),因为下一行要特判边界L的解
    if(!((L-res)%M)) ++ans;//边界L的解
    if(ans)
        if(L<=res) Min=res;//Min=res-(res-L)/M*M;//res就已是最小的解
        else /*if(res<L)*/ Min=res+((L-res-1)/M+1)*M;//ans是解的个数不是要运算的数!
    printf("%lld\n%lld",ans,Min);
}

int main()
{
    n=read(),L=read(),R=read();
    for(int i=1; i<=n; ++i) m[i]=read(),B[i]=read();
    CRT();
    return 0;
}

原文地址:https://www.cnblogs.com/SovietPower/p/8449147.html

时间: 2024-11-10 17:18:54

CODEVS.3990.中国余数定理2(CRT)的相关文章

3990 中国余数定理 2[一中数论随堂练]

3990 中国余数定理 2 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description Skytree神犇最近在研究中国博大精深的数学. 这时,Sci蒟蒻前来拜访,于是Skytree给Sci蒟蒻出了一道数学题: 给定n个质数,以及k模这些质数的余数.问:在闭区间[a,b]中,有多少个k?最小的k是多少? Sci蒟蒻数学能力差了Skytree三条街,所以他只好寻求计算机的帮助.他发邮件给同为oier的你,你能帮他解决这个问

3040 中国余数定理 1[一中数论随堂练]

3040 中国余数定理 1 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Description 摘自算法导论...... 找出第k个被3,5,7除的时候,余数为2,3,2的数: 输入描述 Input Description 一个数k. 输出描述 Output Description 求出第k个符合条件的数. 样例输入 Sample Input 1 样例输出 Sample Output 23 数据范围及提示 Data Size & Hint

3040 中国余数定理 1

3040 中国余数定理 1 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 青铜 Bronze 题目描述 Description 摘自算法导论...... 找出第k个被3,5,7除的时候,余数为2,3,2的数: 输入描述 Input Description 一个数k. 输出描述 Output Description 求出第k个符合条件的数. 样例输入 Sample Input 1 样例输出 Sample Output 23 数据范围及提示 Data Size & Hint k>

初识中国余数定理 (Chinese Remainder Theorem)

初识中国余数定理 (Chinese Remainder Theorem) 中国余数定理介绍 起源: 在<孙子算经>中有这样一个问题: "今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?" 这个问题称为"孙子问题",该问题的一般解法国际上称为"中国剩余定理". 解法: 设未知数为X 1. 找到三个数: 1). 从3和5的公倍数中找到被7除余1的数,15: 2). 从5和7的公

中国余数定理 2(codevs 3990)

题目描述 Description Skytree神犇最近在研究中国博大精深的数学. 这时,Sci蒟蒻前来拜访,于是Skytree给Sci蒟蒻出了一道数学题: 给定n个质数,以及k模这些质数的余数.问:在闭区间[a,b]中,有多少个k?最小的k是多少? Sci蒟蒻数学能力差了Skytree三条街,所以他只好寻求计算机的帮助.他发邮件给同为oier的你,你能帮他解决这个问题吗? 输入描述 Input Description 输入第一行为三个正整数n.a.b. 第2到n+1行,每行有两个整数,分别代表

中国余数定理 1(codevs 3040)

题目描述 Description 摘自算法导论...... 找出第k个被3,5,7除的时候,余数为2,3,2的数: 输入描述 Input Description 一个数k. 输出描述 Output Description 求出第k个符合条件的数. 样例输入 Sample Input 1 样例输出 Sample Output 23 数据范围及提示 Data Size & Hint k>=1; 答案不超过long long所能存储的范围. 典型的数论题. //中国剩余定理水题 #include&

洛谷 P1516 青蛙的约会(中国剩余定理CRT)

题目描述 两青蛙会相遇的条件[(x-y)+k(m-n)]%l=0 令a=m-n,b=l,c=x-y,所以(c+k*a)%b=0 -> aX+bY=c 方程有解,当且仅当c%Gcd(a,b)=0 令r=Gcd(a,b) 为什么(X*(c/r)%(b/r)+b/r)%(b/r)为最小解? 目标解aX+bY==c 有解的条件是c%r=0,也就是c=K*r 那么就办成了aX+bY=K*r 那么也就是解a*(X/K)+b(Y/K)=r 然后扩展欧几里得定理就是解a*X+b*Y=r 那么解出来X之后X就要乘

中国剩余定理 互质与非互质版本

中国剩余定理互质版 设m1,m2,m3,...,mk是两两互素的正整数,即gcd(mi,mj)=1,i!=j,i,j=1,2,3,...,k. 则同余方程组: x = a1 (mod n1) x = a2 (mod n2) ... x = ak (mod nk) 模[n1,n2,...nk]有唯一解,即在[n1,n2,...,nk]的意义下,存在唯一的x,满足: x = ai mod [n1,n2,...,nk], i=1,2,3,...,k. 解可以写为这种形式: x = sigma(ai* 

【bzoj3782】上学路线 dp+容斥原理+Lucas定理+中国剩余定理

题目描述 小C所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M).小C家住在西南角,学校在东北角.现在有T个路口进行施工,小C不能通过这些路口.小C喜欢走最短的路径到达目的地,因此他每天上学时都只会向东或北行走:而小C又喜欢走不同的路径,因此他问你按照他走最短路径的规则,他可以选择的不同的上学路线有多少条.由于答案可能很大,所以小C只需要让你求出路径数mod P的值. 输入 第一行,四个整数N.M.T.P. 接下来的T行,每行两个整数,表示施工的路口的坐标. 输出 一