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 ...
- Intellj Idea使用tomcat部署不成功,死活也找不到解决办法的看这里
Intellij 周六晚上开发一个简单web项目的,使用tomcat打包部署,死活也没法部署成功,和这个问题怼了6个小时,也没搞清楚具体为什么不能访问页面,但是好在最后还是找了个方法把问题解决了.以下 ...
- mysql 证明为什么用limit时,offset很大会影响性能
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/117 首先说明一下MySQL的版本: mysql> sel ...
- Python的range函数详细用法
1. >>> range(1,5) #代表从1到5(不包含5) [1, 2, 3, 4]>>> 2. >>> range(1,5,2) #代表从 ...
- 【分治】peak find
分治算法 算法设计中一种常用的优化方法就是分治的思想,它的解决思路就是将原始的问题划分为性质一样,但是规模减小的子问题,然后通过子问题的解和合并子问题的解得到最终的解,就是分治的思想: 比较常见的分治 ...
- Xamarin 简单的网络请求
//try //{ // var httpReq = (HttpWebRequest)HttpWebRequest.Create(new Uri(re ...
- SQL 多列合并一列
select rtrim(姓)+ rtrim(名) as 姓名 from tb
- Windows上Python2与Python3共存
首先安装好python2与python3版本 因为安装顺序的不同,所以系统默认的版本也不同.如果先安装的是python,那么系统默认的就是python2 如果根据需求需要使用不同的版本,可以使用py命 ...
- ABP架构学习系列二:ABP中配置的注册和初始化
一.手工搭建平台 1.创建项目 创建MVC5项目,手动引入Abp.Abp.Web.Abp.Web.Mvc.Abp.Web.Api 使用nuget添加Newtonsoft.Json.Castle.Cor ...
- 每天学一点Docker(2)
容器runtime 容器runtime是容器真正运行的地方,runtime需要和操作系统kernel紧密结合,为容器提供运行环境. 比如说,java程序比作一个容器,JVM就是runtime.JVM为 ...