首页 > 其他分享 >CRT与EXCRT

CRT与EXCRT

时间:2022-12-22 20:55:36浏览次数:56  
标签:return gcd CRT int ll long EXCRT yu

中国剩余定理-模数之间两两互质
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
//中国剩余定理 CRT
int a[200000];
int r[200000];
int x,y;
void exgcd(int a,int b){
    if(b==0){
        x = 1;
        y = 0;
        return;
    }
    exgcd(b,a%b);
    int tmp = x;
     x  = y;
     y = tmp - a/b*y;
    return;
}
signed main(){
    int k;
    cin>>k;
    int m = 1;
    for(int i = 1;i<=k;i++) cin>>a[i]>>r[i],m*=a[i];
    int ans = 0;
    for(int i = 1;i<=k;i++){
        if(a[i]==0){
             cout<<r[i];
             exit(0);
         }
        int tmp = m/a[i];
        exgcd(tmp,a[i]);
        ans = (ans + r[i]*x*tmp%m)%m;
    }
    cout<<(ans%m+m)%m;
}
拓展中国剩余定理-不保证模数之间两两互质,即逆元法不可用

数学证明见:https://www.luogu.com.cn/blog/blue/kuo-zhan-zhong-guo-sheng-yu-ding-li

点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,mod[100009],yu[100009];

//要用快速乘(龟速乘),防止爆long long
ll qMul(ll a,ll b,ll mo){
    ll an = 0;
    while(b) {
        if(b&1) an =(an+a) % mo;
        a = (a+a)%mo;
        b>>=1;
    }return an%mo;
}

//扩展欧几里得算法,返回gcd(a,b),并计算出ax+by = gcd(a,b)中的x和y
ll exGcd(ll a,ll b,ll &x,ll &y){
    if( b == 0 ) { x = 1;y = 0; return a;}
    ll gcd = exGcd(b,a%b,y,x);  //注意x和y的顺序
    y = y - a/b*x;
    return gcd;
}

int main() {
    ios::sync_with_stdio(false);//加速cin和cout
    cin>>n;
    for(int i = 1;i <= n;i++) cin>>mod[i]>>yu[i];
    ll ans = yu[1],M = mod[1] ,t,y;  //ans表示前i-1个方程式的特解(余数),M为前i-1个方程式的模数的最小公倍数(i从2开始)
    for(int i = 2;i <= n;i++){
        ll mi = mod[i],res = ((yu[i] - ans)%mi + mi)%mi;  //res是等式的右边部分,不能出现负数
        ll gcd = exGcd(M,mi,t,y);        //求出gcd(mi,M)
        if(res % gcd != 0) { cout<<-1<<endl;exit(0); }   //如果等式右边不能整除gcd,方程组无解
        t = qMul(t,res/gcd,mi);            //求出t还要乘上倍数,注意是快速乘取模mi (对谁取模要分清)
        ans += t * M;                               //得到前i个方程的特解(余数)
        M = mi /gcd * M;                         //M等于lcm(M,mi),注意乘法要在除法后面做,否则会爆long long
        ans = (ans%M+M)%M;                //让特解范围限定在0~(M-1)内,防止会出现负数
    }
    cout<<ans;
    return 0;
}



标签:return,gcd,CRT,int,ll,long,EXCRT,yu
From: https://www.cnblogs.com/wujw11world/p/16999559.html

相关文章

  • 中国剩余定理(CRT)
    中国剩余定理(即ChineseRemainderTheorem,简称CRT)可求解如下形式的一元线性同余方程组(其中\(\gcd(m_1,m_2,\dots,m_n)=1\)):\[\begin{cases}x\equiva_1\pmod{m......
  • Crt常用设置
    目录自动批量创建会话标签自动登录脚本自动保存会话日志自动批量创建会话标签https://gitee.com/jiyuchen1/crtSessionTemplate自动登录脚本#$language="VBScript"#......
  • secureCRT yyds
    上一篇使用mobaxterm作为上位机,使用lrzlsz命令和开发收发文件,但是在使用中经常出现卡死,文件无法发送给开发板。后来找了其他软件SecureCRT,这是个付费软件。在知乎平台找到......
  • secureCRT删除键乱码
    解决方法:先打开Options–>SessionOptions–>Terminal–>Emulation(中文:选项–>回话选项–>终端–>仿真)界面下:1.终端(T):选择linux,默认为VT100.2.ANSI颜色(A)打上勾......
  • secureCRT优化设置
    1、设置显示配色主题效果2、会话回滚的缓冲区大小调节3、双击Tab自动克隆会话Tab4、忽略窗口标题更改请求5、底边栏......
  • Qt: MingW编译程序,crt2.o,crtbegin.o,crtend.o,No such file or directory
    QtMingW编译程序,遇见如下错误提示:1、:-1:error:cannotfindcrt2.o:Nosuchfileordirectory2、:-1:error:cannotfindcrtbegin.o:Nosuchfileordirectory3、:......
  • 关闭SecureCRT的自动打印功能
    一、说明每次不小心按到SecureCRT的自动打印时,Secure总是会自动打印,结果打印出很多没用的东西,浪费了大量的纸张,所以请公司内使用SecureCRT的小伙伴一定要关闭掉自动打印功能......
  • 用Ubuntu+SecureCRT实现客户内网控制器的进程状态监控
    一、使用场景描述:用户有一台控制器的三个组件需要进行端口监控,控制器主机因为跟办公网络未在同一个网络区域,因此不能使用ssh进行直连进行监控。客户现场环境如下(见下......
  • SecureCRT串口命令
    1.安装软件pminstall-r安装包地址(该地址必须是挂载在设备上的路径,如/sdcard/xxx.apk)2.卸载软件pmuninstall-k软件包名3.清理软件缓存pmclear软件包名......
  • excrt
    求解同余方程组最小整数解:\[\left\{\begin{matrix}x\equiva_1\pmod{m_1}\\x\equiva_2\pmod{m_2}\\\cdots\\x\equiva_n\pmod{m_n}\end{matrix}\right.\]设......