热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hdu1573非互素的中国剩余定理(疑似有错)

*大牛的思路:典型的中国剩余定理,但是这里是非互质情况下的中国剩余定理。解题思路:1.因为(a1,a2,a3,a4,….,ak)不一定互质,所以不能够直接用中国剩余定理。2

/*大牛的思路:
典型的中国剩余定理,但是这里是非互质情况下的中国剩余定理。
解题思路:
1.因为(a1,a2,a3,a4,….,ak)不一定互质,所以不能够直接用中国剩余定理。
2.x=r1+a1*k1,x=r2+a2*k2,所以有r1+a1*k1=r2+a2*k2,化简后得到 a1*k1=(r2-r1) mod(a2);
用扩展欧几里得可以得到最小的k1,所以x=r1+a1*k1+a1*a2/gcd(a1,a2),
就这样一直替换最后剩余一个同余方程。r1就是最后的解。
对于x=a1 mod b1,x= a2 mod b2,设x=a1+m*b1
所以b1*m=a2-a1 mod b2,利用欧几里德扩展定理求出最小的非负m,
那么x=a1+m*b1就已知,且x最小,如果无解,整个同余式组无解
同时,x+k*b1是所有满足x=a1 mod b1的解,而x+k‘*b2又是所有满足x=a2 mod b2的解
那么,将x+k*b1与x+k‘*b2合并,得到的式子就是x+k*lcm(b1,b2)
于是,上面两个式子可以用x‘=x mod lcm(b1,b2)来替代
最后,就只剩下一个式子了,求得的最小的x就是答案
对于一次同余式ax=b mod n,设d=gcd(a,n),则同余式有解的充要条件为d|b
假设d=a*x‘+n*y‘,则x0=b/d*x‘一定为方程组的一个解,且共有d个解,
(证明可以参考算法导论)最小正整数解为(x0%n/d+n/d)%(n/d)
*/
#include
#include
#include
#include
using namespace std;
typedef __int64 IntType;
IntType mod(IntType value,IntType modeNum)//求模运算,考虑负数
{
if(value <0)
value = value+((-value)/modeNum+1)*modeNum;
return value%modeNum;
}
IntType exgcd(IntType a,IntType b,IntType &x,IntType &y){//ax+by = 1
if( b == 0 ) {
x = 1;
y = 0;
return a;
}
else{
IntType x1,y1;
IntType d = exgcd ( b , mod(a,b) , x1 , y1 );
x = y1;
y= x1 - a / b * y1;
return d;
}
}
int main()
{
IntType n,m,temp;
IntType num[11],k;
IntType a[11],b[11];
IntType t;
scanf("%I64d",&t);
while(t--)
{
scanf("%I64d %I64d",&n,&m);
for(IntType i = 0; i {
scanf("%I64d",&a[i]);
}
for(IntType i = 0; i {
scanf("%I64d",&b[i]);
}
bool flag = true;
for(IntType i = 1; i {
IntType r = b[0] - b[i];
IntType k2,k1,c;
c = exgcd(a[i],a[0],k2,k1);
/*printf("gcd(%ld,%ld) = %ld\n",a[i],a[0],c);
printf("%ld * %ld = %ld (mod %d)\n",a[i],k2,c,a[0]);*/
if(mod(r,c) != 0)
{
flag = false;
break;
}
a[0] = a[0]/c*a[i];//a[0]变为lcm(a[0],a[i])
b[0] = mod((a[i]*k2*r/c)+b[i],a[0]);
/*printf("b[0] = %ld\n",b[0]);*/
}
if(flag == false||b[0] > n)
printf("0\n");
else
{
if(b[0] == 0)
printf("%I64d\n",(n-b[0])/a[0]);
else
printf("%I64d\n",(n-b[0])/a[0]+1);
}
}
return 0;
}

 

本文出自 “Qero” 博客,请务必保留此出处http://8590696.blog.51cto.com/8580696/1358917


推荐阅读
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • NX二次开发:UFUN点收集器UF_UI_select_point_collection详解
    本文介绍了如何在NX中使用UFUN库进行点收集器的二次开发,包括必要的头文件包含、初始化和选择点集合的具体实现。 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • 自定义滚动条美化页面内容
    当页面内容超出显示范围时,为了提升用户体验和页面美观,通常会添加滚动条。如果默认的浏览器滚动条无法满足设计需求,我们可以自定义一个符合要求的滚动条。本文将详细介绍自定义滚动条的实现过程。 ... [详细]
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • 本文详细介绍了Linux系统中用于管理IPC(Inter-Process Communication)资源的两个重要命令:ipcs和ipcrm。通过这些命令,用户可以查看和删除系统中的消息队列、共享内存和信号量。 ... [详细]
  • 本文介绍了如何在 ASP.NET 中设置 Excel 单元格格式为文本,获取多个单元格区域并作为表头,以及进行单元格合并、赋值、格式设置等操作。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • Manacher算法详解:寻找最长回文子串
    本文将详细介绍Manacher算法,该算法用于高效地找到字符串中的最长回文子串。通过在字符间插入特殊符号,Manacher算法能够同时处理奇数和偶数长度的回文子串问题。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
author-avatar
奶油晓生2502876643
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有