hdu_1573 X问题(不互素的中国剩余定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1573
X问题
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5012 Accepted Submission(s): 1667
10 3
1 2 3
0 1 2
100 7
3 4 5 6 7 8 9
1 2 3 4 5 6 7
10000 10
1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9
0
3
题解:
这个题直接给出了中国剩余定理的形式:X===a[i](mod b[i])但是这里注意一下这个b[i]之间有可能不是互素的,所以这里给出一个不互素的中国剩余定理的求解方式
考虑两个方程
x===a1(mod b1)
x===a2(mod b2)
可得:x = a1+b1*r1;
x = a2+b2*r2;
有 a1+b1*r1 = a2+b2*r2;
有b1*r1-b2*r2 = a2-a1
这样可以通过扩展欧几里得解的r1,这里注意一下(a2-a1)%gcd(b1,b2)==0时候有解
解出r1后则x0 = a1+b1*r1位这个方程组的一个解
则这两个方程可以写成是x===x0(mod b1*b2/gcd(b1,b2))的形式
然后依次处理没两个式子,最后得到的就是解
注意这里每次求得的解都要保证是最小的解的形式,所以可以通过用(x%mod+mod)%mod 的形式来控制
最后统计次数的时候从最小的时候循环到n即可统计出个数
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
ll a[],b[];
ll exgcd(ll a, ll b, int &x, int &y)
{
if(b==){
x = ;
y = ;
return a;
}
ll ans = exgcd(b,a%b,x,y);
int tx = x;
x = y;
y = tx-(a/b)*y;
return ans;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ll n,m;
scanf("%lld%lld",&n,&m);
for(int i = ; i < m; i++){
scanf("%lld",&a[i]);
}
for(int i = ; i < m; i++){
scanf("%lld",&b[i]);
}
bool fl = ;
for(int i = ; i < m; i++){
//更新a[i]和b[i];
int x, y;
ll d = exgcd(a[i-],a[i],x,y);
if((b[i]-b[i-])%d){
fl = true;
break;
}
ll t = a[i]/d;
x = x*(b[i]-b[i-])/d;
x = (x%t+t)%t;
ll N = a[i-]*x+b[i-];
b[i] = N;
a[i] = a[i]*a[i-]/d;
b[i] = (b[i]%a[i]+a[i])%a[i];
}
if(fl||n<b[m-]) printf("0\n");
else printf("%d\n",(n-b[m-])/a[m-]+-(b[m-]==?:));//因为要求是正整数,所以0不可以取
}
return ;
}
hdu_1573 X问题(不互素的中国剩余定理)的更多相关文章
- hdu_1370Biorhythms(互素的中国剩余定理)
Biorhythms Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- hdu1573X问题(不互素的中国剩余定理)
X问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 数论F - Strange Way to Express Integers(不互素的的中国剩余定理)
F - Strange Way to Express Integers Time Limit:1000MS Memory Limit:131072KB 64bit IO Format: ...
- POJ 2891 中国剩余定理(不互素)
Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 17877 ...
- hdu 3579 Hello Kiki【中国剩余定理】(模数不要求互素)(模板题)
<题目链接> 题目大意: 给你一些模数和余数,让你求出满足这些要求的最小的数的值. 解题分析: 中国剩余定理(模数不一定互质)模板题 #include<stdio.h> usi ...
- ACM/ICPC 之 中国剩余定理+容斥原理(HDU5768)
二进制枚举+容斥原理+中国剩余定理 #include<iostream> #include<cstring> #include<cstdio> #include&l ...
- 中国剩余定理(Chinese Remainder Theorem)
我理解的中国剩余定理的含义是:给定一个数除以一系列互素的数${p_1}, \cdots ,{p_n}$的余数,那么这个数除以这组素数之积($N = {p_1} \times \cdots \tim ...
- 【中国剩余定理】【容斥原理】【快速乘法】【数论】HDU 5768 Lucky7
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5768 题目大意: T组数据,求L~R中满足:1.是7的倍数,2.对n个素数有 %pi!=ai 的数 ...
- 【中国剩余定理】POJ 1006 & HDU 1370 Biorhythms
题目链接: http://poj.org/problem?id=1006 http://acm.hdu.edu.cn/showproblem.php?pid=1370 题目大意: (X+d)%23=a ...
随机推荐
- Visual Studio 2017 : client version 1.22 is too old
使用Vs2017 编译 eShopOnContainers-ServicesAndWebApps 时,报了错误: Microsoft.DotNet.Docker.CommandLineClientEx ...
- Java中 &&与&,||与|的区别
区别 && || 是逻辑运算,支持短路运算 & | 是位运算,不支持短路运算 短路运算 当有多个表达式时,左边的表达式值可以确定结果时,就再继续运算右边的表达式的值; 举例 ...
- 第四节 mount /who / mkdir /rmdir /rm /cp /mv /touch /cat /tac/head /tail /more /less / chmod /chown /umask /chattr /lsattr /history /echo
***Linux下的文件类型如下: 9 8 7 6 5 4 3 2 1 0- r w x r - x r - x 第9位表示文件类型,可以为p.d.l.s.c.b和-:p表示命名管道文件 -pipe ...
- Visual Representation of SQL Joins
原文:http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins 从视图上介绍了7种不同类型的JOIN ...
- PHP array_map()
PHP array_map() 函数 将函数作用到数组中的每个值上,每个值都乘以本身,并返回带有新值的数组: <?php function myfunction($v) { return($v* ...
- 给yii架构的网站做Android客户端
网站未预留接口.给这类网站制作客户端就是模拟网页发送的post和get请求,然后获取服务器返回的数据. 1.在做客户端时先使用httpwatch分析浏览器发送的get和post请求的内容和URL.分析 ...
- C语言学生管理系统(增进版)
在原版上进行改进,主要改进的功能有. 1.利用atof:将字符串转换为浮点型: 利用atoi:将字符串转换为整型: 原文地址:http://www.cnblogs.com/sddai/p/577412 ...
- 前端学习_04_font-awesome字体图标
使用font-awesome字体图标库 font-awesome是一个比较大的矢量图标库,包含大部分IT类公司logo和常用的一些小图标,通过使用font-awesome提供的css样式集,可以在网页 ...
- Qt创建停靠悬浮窗口
1.Qt实现窗口停靠和悬浮使用类QDockWidget,它有两个重要方法用来设置停靠特性以及停靠区域, dw1->setFeatures(QDockWidget::DockWidgetMovab ...
- golang 类型断言的学习
在php中有一个 serialize() 函数 可以把数组序列化成字符串进行存储和传输 如果想反序列化这种字符串,在php中只需要一个简单的unserialize() 函数就可以完成了.但是在gola ...