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

  大致理解并参考他的代码后便去试试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. 【转】MYSQL入门学习之三:全文本搜索

    转载地址:http://www.2cto.com/database/201212/173873.html 一.理解全文本搜索   www.2cto.com   1.MyISAM支持全文本搜索,而Inn ...

  2. 如何将vs2012项目的网站布置到iis上,实现内网访问

    1首先获得你本机的ip地址 可以通过命令行输入 ipconfig/all 2配置电脑的iis(前提是你已经安装了) 右击我的电脑选择管理 右键网站添加网页 会出来上面的对话框 选择直接的项目web路径 ...

  3. 测试Animation大型动画文件拆分播放的可行性

    最近遇到一个问题,剧情动画文件大了复杂了之后,每次修改输出很麻烦,导出fbx就需要20分钟. 所以我想到了一个比较好的解决方法,在unity这边解决.把动画文件拆分成若干份,然后赋予不同的层并行播放 ...

  4. mongoDB Replica集群配置(1主+1从+1仲裁)

    1.mongoDB节点介绍 主节点(Primary) 在复制集中,主节点是唯一能够接收写请求的节点.MongoDB在主节点进行写操作,并将这些操作记录到主节点的oplog中.而从节点将会从oplog复 ...

  5. protobuf安装

    Protocol Buffers - Google's data interchange format 一.简介 名字已经很好的说明它是什么,这里还是要简单的介绍一下,protobuf是protoco ...

  6. tensor

    初始化 z = torch.Tensor(,,,,) --可以创建多维数组.里面是随机的数. s = torch.Tensor(,):fill() --用1填充 t = torch.rand(,) m ...

  7. PHPExcel的使用与手册说明

        1.下载PHPExcel插件 2.解压后提取classes文件夹到工作目录,并重命名为PHPExcel 下载地址:http://phpexcel.codeplex.com/ 3.引入与实例化 ...

  8. java实现按拼音排序名称

    private static String[] nameArray = {"张三","李四","王二","付火"}; @ ...

  9. 安卓开发之json解析

    1.从网页获取json返回字符串 public class ReadNet extends AsyncTask<URL, Integer, String> { @Override      ...

  10. 有关Duilib的博客(持续更新)

    1.转载:http://blog.csdn.net/LostSpeed/article/category/1896505 2.支持多线程和动画 转载:http://blog.csdn.net/Skil ...