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

  大致理解并参考他的代码后便去试试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问题的更多相关文章

  1. HDU 1573 CRT

    CRT模板题 /** @Date : 2017-09-15 13:52:21 * @FileName: HDU 1573 CRT EXGCD.cpp * @Platform: Windows * @A ...

  2. 中国剩余定理 hdu 1573 X问题

    HDU 1573 X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  3. HDU 1573 X问题 中国剩余定理

    链接:pid=1573">http://acm.hdu.edu.cn/showproblem.php? pid=1573 题意:求在小于等于N的正整数中有多少个X满足:X mod a[ ...

  4. hdu 1573 X问题 (非互质的中国剩余定理)

    X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. hdu 1573 A/B (扩展欧几里得)

    Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973)= 1). Input 数据的第一行 ...

  6. X问题 HDU - 1573(excrt入门题)

    X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. 一些关于中国剩余定理的数论题(POJ 2891/HDU 3579/HDU 1573/HDU 1930)

    2891 -- Strange Way to Express Integers import java.math.BigInteger; import java.util.Scanner; publi ...

  8. hdu 1573 X问题 不互质的中国剩余定理

    X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. HDU 1573 X问题 (中国剩余定理)

    题目链接 题意 : 中文题不详述. 思路 : 中国剩余定理.求中国剩余定理中解的个数.看这里看这里 #include <stdio.h> #include <iostream> ...

随机推荐

  1. Python模块学习

    6. Modules If you quit from the Python interpreter and enter it again, the definitions you have made ...

  2. I'm Telling the Truth(二分图)

    .I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...

  3. Poj(3615),Floyd,最大值中的最小值

    题目链接:http://poj.org/problem?id=3615 题意:大致题意:有N个木桩,和M个木桩对之间的高度差(从x跳到y需要往上跳的高度).从x跳跃到y的路径消耗的体力值是路径中的一个 ...

  4. Servlet基础简单总结(上)

    Servlet基础一些简单总结(上): 1.Java Servlet是运行在Web服务器上的Java程序2.Java平台给Servlet开发者提供了强大的API/面向对象编程平台无关/强类型/垃圾回收 ...

  5. 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 ...

  6. Linux Source命令及脚本的执行方式解析

    转 http://www.51testing.com/html/38/225738-206878.html 当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录:这时就想到用sou ...

  7. POJ 1840 Eqs 暴力

      Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The ...

  8. Android设备唯一性判断

    前段时间项目需要一个功能,就是在操作完某一个逻辑之后返回给客户一个红包,安全校验团队需要我们提供android设备的唯一标示,起初直接通过获取设备的imei号传给了server端,后台公司云迹监控发现 ...

  9. 【Unity3D游戏开发】定制新建C#文件的头描述 (三三)

    unity添加新脚本的时候,可以定制[开发者姓名][开发日期][文件描述][版权声明]等,省的到时候不知道谁写的,也没有个描述,关键是TNND连个背锅的人都没有 其实unity已经给我们提供了新建脚本 ...

  10. vim 跳到指定行

    在编辑模式下输入 ngg 或者 nG n为指定的行数(如25) 25gg或者25G 跳转到第25行. 在命令模式下输入行号n : n 如果想打开文件即跳转 vim +n FileName 查看当然光标 ...