【HDU1573】X问题

【题目描述】

求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = b[i], … (0 < a[i] <= 10)。

【题解】

模板题,为读者提供一个中国剩余定理(非互质版)的模板

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<ctime>
 7 #include<algorithm>
 8 using namespace std;
 9 int T,n,s,M,ans,flag,a[15],m[15];
10 inline int read()
11 {
12     int x=0,f=1;  char ch=getchar();
13     while(!isdigit(ch))  {if(ch==‘-‘)  f=-1;  ch=getchar();}
14     while(isdigit(ch))  {x=x*10+ch-‘0‘;  ch=getchar();}
15     return x*f;
16 }
17 void exgcd(int a,int b,int &g,int &x,int &y)
18 {
19     if(b==0)  {x=1; y=0; g=a; return;}
20     exgcd(b,a%b,g,x,y);
21     int t=x;x=y;y=t-a/b*y;
22 }
23 void China()
24 {
25     int A=a[1],k,y;  M=m[1];
26     for(int i=2;i<=n;i++)
27     {
28         int da=a[i]-A,g;
29         exgcd(M,m[i],g,k,y);
30         if(da%g)  {flag=1; return;}
31         int t=m[i]/g;
32         k*=da/g;
33         k=(k+t)%t;
34         A+=k*M;
35         M=M*m[i]/g;
36         A=(A+M)%M;
37     }
38     ans=A;
39 }
40 int main()
41 {
42     freopen("cin.in","r",stdin);
43     freopen("cout.out","w",stdout);
44     T=read();
45     while(T--)
46     {
47         s=read();  n=read();  flag=0;
48         for(int i=1;i<=n;i++)  m[i]=read();
49         for(int i=1;i<=n;i++)  a[i]=read();
50         China();
51         if(ans>s||flag)  {printf("0\n");  continue;}
52         int sum=(s-ans)/M+1;
53         if(ans==0)  sum--;
54         printf("%d\n",sum);
55     }
56     return 0;
57 }
时间: 2024-10-03 06:19:07

【HDU1573】X问题的相关文章

hdu1573 X问题

hdu1573 X问题 excrt 跑一遍excrt,蓝后算算个数 用%lld就出锅(大雾) #include<cstdio> #include<iostream> using namespace std; typedef long long ll; ll mod(ll x,ll p) {return x<0 ?x+p:x;} ll mul(ll x,ll y,ll p){ ll tmp=x*y-(ll)((long double)x/p*y+1.0e-8)*p; retur

hdu1573:数论,线性同余方程组

题目大意: 给定一个N ,m 找到小于N的  对于i=1....m,满足  x mod ai=bi  的 x 的数量. 分析 先求出 同余方程组 的最小解x0,然后 每增加lcm(a1...,am)都会存在一个解,注意必须小于N 不能等于 代码: #include <iostream> #include <stdio.h> #include<string.h> #include<algorithm> #include<string> #inclu

hdu-1573 Robot Motion

Robot Motion Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10219   Accepted: 4977 Description A robot has been programmed to follow the instructions in its path. Instructions for the next direction the robot is to move are laid down in

X问题(中国剩余定理+不互质版应用)hdu1573

X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3921    Accepted Submission(s): 1253 Problem Description 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod

HDU1573:X问题(解一元线性同余方程组)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1573 题目解析;HDU就是坑,就是因为n,m定义成了__int64就WAY,改成int就A了,无语. 这题就是求解一元线性同余方程组的解满组小于正整数n的数目.最小正整数的解为X=(X*(c/d)%t+t)%t;  X=a1*X+r1;其中X为扩展欧几里得解出来的特解,这m个方程组的循环区间为lcm(a1,a2,a3...am),所以答案为(n-X)/lcm+1; #include <iostream>

HDU1573 X问题【一元线性同余方程组】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1573 题目大意: 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], -, X mod a[i] = b[i], - (0 < a[i] <= 10). 思路: 先求出数组b[]中所有数的最小公倍数lcm,再求解出该一元线性同余方程组在lcm范围内的解为a,题目要 求解x是小于等于N的正整数,则

exgcd&amp;&amp;中国剩余定理专题练习

hdu1573求中国剩余定理解的个数 #include <iostream> #include <cstdio> using namespace std; int a[100],b[100]; int exgcd(int a,int b,int &x,int &y){ if(b==0){ x=1;y=0;return a; } int d=exgcd(b,a%b,x,y),t; t=x;x=y;y=t-a/b*y; return d; } int main(){ i

数论随记(二)

HDU1573 /*中国剩余定理*/ 10. 公式 1. ab(mod m) (a mod m) b (mod m) (化简); HDU1395 (2^x 1(mod n) 2^x%n 1(mod n) ) 2. xa(mod m) x*ka*k(mod m); 3. xn-a(mod m) x+an(mod m); HDU1788 4. gcd(a,b)=k gcd(a/k,b/k)=1; 5. a%k= (变型: %k= ) HDU1852 如果m与k互素,则(a/m)%k=a*m^(phi

HDU-1573-X问题(线性同余方程组)

链接: https://vjudge.net/problem/HDU-1573 题意: 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], -, X mod a[i] = b[i], - (0 < a[i] <= 10). 思路: 解线性同余方程组,得到\(x+k*m \leq n\). 解为\(1+(n-x)/m\). 当x为0时答案要减一. 代码: #include<iostream