HDOJ 1573 X问题(中国剩余定理非互质版本)
2016-03-08 17:53
387 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1573
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define LL __int64 using namespace std; LL n,k,m[100],a[100];//模数为m,余数为a, X % m = a LL T, N, m0, a0; //m不互素 LL extend_gcd(LL a, LL b, LL &x, LL &y) { if(a == 0 && b == 0)return -1; if(b ==0 ){x = 1; y = 0;return a;} LL d = extend_gcd(b,a%b,y,x); y -= a/b*x; return d; } bool solve(LL &m0, LL &a0, LL m, LL a) { LL y,x; LL g = extend_gcd(m0,m,x,y); if (abs(a - a0)%g) return false; x *= (a - a0)/g; x %= m/g; a0 = (x*m0 + a0); m0 *= m/g; a0 %= m0; if( a0 < 0 )a0 += m0; return true; } /* * 无解返回false,有解返回true; * 解的形式最后为 a0 + m0 * t (0<=a0<m0) a0是最小的非负整数解 */ bool MLES(LL &m0, LL &a0, LL n)//解为 X = a0 + m0 * k { bool flag = true; m0 = 1; a0 = 0; for(int i = 0; i < n; i++) if( !solve(m0,a0,m[i],a[i]) ) { flag = false; break; } return flag; } int main() { scanf("%I64d", &T); while (T--) { scanf("%I64d%I64d", &N, &n); for (int i = 0; i < n; i++) scanf("%I64d", &m[i]); for (int i = 0; i < n; i++) scanf("%I64d", &a[i]); if(!MLES(m0, a0, n) || a0 > N) printf("0\n"); else { if(!a0) printf("%I64d\n",(N-a0)/m0); else printf("%I64d\n",(N-a0)/m0+1); } } return 0; }
相关文章推荐
- 如何调试binder?
- 8款PHP调试工具
- 四
- JQ手册
- CodeForces - 630N Forecast (解一元二次方程组)
- android缓存数据到本地
- 混合高斯模型去除背景
- windows的坑
- 拷贝构造,构造函数,析构函数的调用顺序
- Android自定义View控件
- 开源实时日志分析ELK平台部署
- 树、二叉树(二)
- 周总结一
- C#索引器3 重载
- 读书笔记_自定义view
- 如何在Linux上为Python语言安装Redis客户端
- 百搭的鸡丁,每一道都是美味的下饭菜
- Codeforces #345 Div2 C Watchmen 容斥
- pod 遇到的坑
- Caused by: java.lang.ClassNotFoundException: org.aspectj.util.PartialOrder$PartialComparable