当前位置: 首页 > news >正文

算法笔记--中国剩余定理

中国剩余定理(CRT)的表述如下

设正整数两两互素,则同余方程组

 

                             

 

有整数解。并且在模下的解是唯一的,解为

 

                               

 

其中,而的逆元。

模板:

int ex_gcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    int ans=ex_gcd(b,a%b,y,x);
    y-=a/b*x;
    return ans;
}
int CRT(int a[],int m[],int n)
{
    int M=1;
    int ans=0;
    for(int i=1;i<=n;i++)M*=m[i];
    for(int i=1;i<=n;i++)
    {
        int x,y;
        int Mi=M/m[i];
        ex_gcd(Mi,m[i],x,y); 
        ans=(ans+a[i]*Mi*x)%M;
    }
    if(ans<0)ans+=M;
    return ans;
}

例题1:ZSTUOJ 1265: Biorhythms

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))

int a[10],m[10];
int ex_gcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    int ans=ex_gcd(b,a%b,y,x);
    y-=a/b*x;
    return ans;
}
int CRT(int a[],int m[],int n)
{
    int M=1;
    int ans=0;
    for(int i=1;i<=n;i++)M*=m[i];
    for(int i=1;i<=n;i++)
    {
        int x,y;
        int Mi=M/m[i];
        ex_gcd(Mi,m[i],x,y); 
        ans=(ans+a[i]*Mi*x)%M;
    }
    if(ans<0)ans+=M;
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int p,e,i,d;
    int cse=1;
    while(cin>>p>>e>>i>>d)
    {
        if(p==-1&&e==-1&&i==-1)break;
        a[1]=p%23;
        a[2]=e%28;
        a[3]=i%33;
        m[1]=23;
        m[2]=28;
        m[3]=33;
        int ans=CRT(a,m,3);
        if(ans<=d)ans+=21252;
        cout<<"Case "<<cse++<<": the next triple peak occurs in "<<ans-d<<" days."<<endl;
    }
    return 0; 
} 
View Code

例题2:

 

中国剩余定理扩展——求解模数不互质情况下的线性方程组:

 

  普通的中国剩余定理要求所有的互素,那么如果不互素呢,怎么求解同余方程组?

 

  这种情况就采用两两合并的思想,假设要合并如下两个方程:

 

                  

  那么得到:

    

  我们需要求出一个最小的xx使它满足:

                 

  那么x1x2就要尽可能的小,于是我们用扩展欧几里得算法求出x1x1的最小正整数解,将它代回a1+m1,得到x的一个特解x′,当然也是最小正整数解。

  所以xx的通解一定是xx′加上lcm(m1,m2)k,这样才能保证xm1m2的余数是a1a2。由此,我们把这个x当做新的方程的余数,把lcm(m1,m2)l当做新的方程的模数。(这一段是关键

                 

  参考:https://www.cnblogs.com/MashiroSky/p/5918158.html

 

转载于:https://www.cnblogs.com/widsom/p/7696257.html

相关文章:

  • 创建Kafka0.8.2生产者与消费者
  • IDEA在编辑时提示could not autowire
  • linux 使用记录
  • 关于ashx不可重定向问题
  • 有关“树上剩余几只鸟”的问题的思考及解答
  • 可以放在页面任何地方de 天气插件
  • yum安装指定版本的软件包的方法
  • 探秘Spring AOP (三) Spring AOP 使用讲解 2
  • 基于java config的springSecurity(四)--启用全局方法安全
  • 黑客预警:搞瘫北美互联网?规模更大的僵尸网络现身
  • 一个关于ConfigurationManager.GetSecion方法的小问题
  • 基础大概回顾
  • 重新学习Mysql数据库3:Mysql存储引擎与数据存储原理
  • P1679 神奇的四次方数
  • nginx服务企业应用
  • Android系统模拟器绘制实现概述
  • ES6--对象的扩展
  • javascript从右向左截取指定位数字符的3种方法
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • leetcode-27. Remove Element
  • linux学习笔记
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Python语法速览与机器学习开发环境搭建
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • ReactNative开发常用的三方模块
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 设计模式走一遍---观察者模式
  • 学习ES6 变量的解构赋值
  • mysql面试题分组并合并列
  • 关于Android全面屏虚拟导航栏的适配总结
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​iOS实时查看App运行日志
  • !$boo在php中什么意思,php前戏
  • # centos7下FFmpeg环境部署记录
  • %check_box% in rails :coditions={:has_many , :through}
  • (3)STL算法之搜索
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)ObjectiveC 深浅拷贝学习
  • .equals()到底是什么意思?
  • .Family_物联网
  • .gitignore
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .net与java建立WebService再互相调用
  • ::
  • ??如何把JavaScript脚本中的参数传到java代码段中