HDOJ-1576(数论)
2015-07-27 16:19
351 查看
看着像扩展欧几里得,努力往上面凑吧。
令M=9973,X=A/B, Y=A/M
因为n=A%M=A-(A/M)*M=BX-MY
现在有BX-MY=n了,B和M是已知的,X,Y未知的,距离扩展欧几里得还差一点。
由于gcd(B,M)=1(题干里说了,要利用上),利用扩展欧几里得我们可以算出BX‘+MY’=1中X'和Y'的值、
(关于系数正负号的问题,还有待学习......)
X=N*X',最后为了防止X出现负数,需要处理一下。
令M=9973,X=A/B, Y=A/M
因为n=A%M=A-(A/M)*M=BX-MY
现在有BX-MY=n了,B和M是已知的,X,Y未知的,距离扩展欧几里得还差一点。
由于gcd(B,M)=1(题干里说了,要利用上),利用扩展欧几里得我们可以算出BX‘+MY’=1中X'和Y'的值、
(关于系数正负号的问题,还有待学习......)
X=N*X',最后为了防止X出现负数,需要处理一下。
#include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; typedef long long LL; const int m=9973; //计算 ax+by=gcd(a,b),返回gcd值,求出xy LL Ex_gcd(LL a, LL b, LL &x, LL &y) { LL d; if(a==0 && b==0) return -1; if(b==0) { x = 1; y = 0; return a; } d = Ex_gcd(b, a%b, y, x); y -= a / b * x; return d; } void work() { LL n,b,x,y; scanf("%I64d%I64d",&n,&b); Ex_gcd(b,m,x,y); x *= n; //处理一下,防止出现X出现负数 x = (x % m + m) % m; printf("%I64d\n", x); } int main() { int T; scanf("%d",&T); while(T--) work(); return 0; }
相关文章推荐
- 我的学习日志009:“密码生成器”
- 如何使用iOS 8的虚化效果(Swift版本)
- Nagios邮件报警设置(解决邮件中文乱码问题)
- Rails Mail发送不成功
- JS 错误处理与调试
- 【工作笔记0005】IIS6.0 伪静态设置,伪静态规则
- NYOJ 541 最强DE 战斗力(大数水)
- 参数(parameter)和属性(Attribute)的区别
- screen & tmux 技巧:linux后台运行程序
- 大型数据库应用解决方案总结
- iOS的面向对象(类和对象)
- ZeroMQ——一个轻量级的消息通信组件 C#
- Nexus私服搭建
- 机房合作--简单封装
- mysql IFNULL IF
- SQL Server遇到的错误和有用的tools
- searchDisplayController 引起的数组越界处理办法
- Java中ArrayList类的用法(转)
- Android 保存数据到文件
- EALayout 第六节 LinerLayout线性布局器