hdu 1573 X问题
数论题,本想用中国剩余定理,可是取模的数之间不一定互质,用不了,看到网上有篇文章写得很好的:数论——中国剩余定理(互质与非互质),主要是采用合并方程的思想:

大致理解并参考他的代码后便去试试hdu上这道题,可还是wa了数遍。
#include<cstdio>
#define scd(x) scanf("%d",&x)
#define sclld(x) scanf("%I64d",&x)
#define prd(x) printf("%d\n",x)
#define For(i,s,t) for(int i=s; i<t; ++i)
typedef long long LL; LL gcd(LL a, LL b) { return b==? a: gcd(b,a%b); }
LL lcm(LL x, LL y) { return x/gcd(x,y)*y; } void gcd(LL a, LL b, LL &d, LL &x, LL &y){
if(!b) { d=a; x=; y=; }
else { gcd(b,a%b,d,y,x); y-= x*(a/b); }
} LL inv(LL a, LL n){
LL d,x,y;
gcd(a,n,d,x,y);
return d==? (x+n)%n:-;
} bool merge(LL a1, LL n1, LL a2, LL n2, LL &aa, LL &nn){
LL d= gcd(n1,n2), c= a2-a1;
if(c%d) return ;
c= (c%n2+n2)%n2;
c/= d;
n2/= d;
c= c*inv(n1/d,n2)%n2;
c= c*n1+a1;
nn= n1*n2;
aa= (c%nn+nn)%nn;
return true;
} LL ext_china(LL len, LL a[], LL n[]){
LL a1= a[], n1= n[];
for(LL i=; i<len; ++i){
LL aa, nn;
if(!merge(a1,n1,a[i],n[i],aa,nn)) return -;
a1= aa;
n1= nn;
}
return (a1%n1+n1)%n1;
} LL a[], b[]; int main(){
int t;
LL n,m,M;
scd(t);
while(t--){
sclld(n); sclld(m);
M= ;
For(i,,m){
sclld(a[i]);
M= lcm(M,a[i]);
}
For(i,,m) sclld(b[i]);
LL tmp= ext_china(m,b,a);
if(tmp== -){
puts("");
continue;
}
int ans= ;
while(tmp<=n){
if(tmp) ++ans;
tmp+= M;
}
prd(ans);
}
return ;
}
不想用cin,cout便用宏替换来代替输入输出了,有几个wa点:1.ext_china中有可能返回-1,要分开处理;2. tmp值一开始可能是0,不能算入最后结果中;3. M的值不能是a数组的简单相乘,应是它们的最小公倍数才对。



hdu 1573 X问题的更多相关文章
- HDU 1573 CRT
CRT模板题 /** @Date : 2017-09-15 13:52:21 * @FileName: HDU 1573 CRT EXGCD.cpp * @Platform: Windows * @A ...
- 中国剩余定理 hdu 1573 X问题
HDU 1573 X问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 1573 X问题 中国剩余定理
链接:pid=1573">http://acm.hdu.edu.cn/showproblem.php? pid=1573 题意:求在小于等于N的正整数中有多少个X满足:X mod a[ ...
- hdu 1573 X问题 (非互质的中国剩余定理)
X问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 1573 A/B (扩展欧几里得)
Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973)= 1). Input 数据的第一行 ...
- X问题 HDU - 1573(excrt入门题)
X问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 一些关于中国剩余定理的数论题(POJ 2891/HDU 3579/HDU 1573/HDU 1930)
2891 -- Strange Way to Express Integers import java.math.BigInteger; import java.util.Scanner; publi ...
- hdu 1573 X问题 不互质的中国剩余定理
X问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 1573 X问题 (中国剩余定理)
题目链接 题意 : 中文题不详述. 思路 : 中国剩余定理.求中国剩余定理中解的个数.看这里看这里 #include <stdio.h> #include <iostream> ...
随机推荐
- Python模块学习
6. Modules If you quit from the Python interpreter and enter it again, the definitions you have made ...
- I'm Telling the Truth(二分图)
.I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- Poj(3615),Floyd,最大值中的最小值
题目链接:http://poj.org/problem?id=3615 题意:大致题意:有N个木桩,和M个木桩对之间的高度差(从x跳到y需要往上跳的高度).从x跳跃到y的路径消耗的体力值是路径中的一个 ...
- Servlet基础简单总结(上)
Servlet基础一些简单总结(上): 1.Java Servlet是运行在Web服务器上的Java程序2.Java平台给Servlet开发者提供了强大的API/面向对象编程平台无关/强类型/垃圾回收 ...
- MySQL PLSQL Demo - 005.IF THEN ELSEIF THEN ELSE END IF
drop procedure if exists p_hello_world; create procedure p_hello_world(in v_id int) begin ) then sel ...
- Linux Source命令及脚本的执行方式解析
转 http://www.51testing.com/html/38/225738-206878.html 当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录:这时就想到用sou ...
- POJ 1840 Eqs 暴力
Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The ...
- Android设备唯一性判断
前段时间项目需要一个功能,就是在操作完某一个逻辑之后返回给客户一个红包,安全校验团队需要我们提供android设备的唯一标示,起初直接通过获取设备的imei号传给了server端,后台公司云迹监控发现 ...
- 【Unity3D游戏开发】定制新建C#文件的头描述 (三三)
unity添加新脚本的时候,可以定制[开发者姓名][开发日期][文件描述][版权声明]等,省的到时候不知道谁写的,也没有个描述,关键是TNND连个背锅的人都没有 其实unity已经给我们提供了新建脚本 ...
- vim 跳到指定行
在编辑模式下输入 ngg 或者 nG n为指定的行数(如25) 25gg或者25G 跳转到第25行. 在命令模式下输入行号n : n 如果想打开文件即跳转 vim +n FileName 查看当然光标 ...