HDU-1573 X问题(数论:最小公倍数)
2016-08-04 17:18
288 查看
HDU-1573 X问题(数论:最小公倍数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1573
题意:
给定m个不互质数a[i],求n以内 满足 x % a[i] == b[i] 的 x 个数
题解:
余数:n % lcm(a[i])【最小公倍数】
当x>余数,范围为(余数+1 - 余数+lcm) ,分 n/lcm 个段, 判断x== lcm(a[i])+b[i]符合,即x== lcm(a[i])*n +b[i] — n倍的最小公倍数都符合条件
当x<余数,范围为(1 - yu) ,判断 x % lcm(a[i]) == b[i] 符合条件
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; typedef long long LL; const int maxn = 20; int n,m,k,t,num,xx,cnt; int a[maxn],b[maxn]; int gcd(int a,int b){ if(a<b){ int w = b; b = a,a = w; } return b==0?a:gcd(b,a%b); } int main(){ scanf("%d",&t); while(t--){ scanf("%d %d",&n,&m); for(int i=1; i<=m; i++) scanf("%d",&a[i]); for(int i=1; i<=m; i++) scanf("%d",&b[i]); int lcm = 1; for(int i=1; i<=m; i++) {//a[i] 最小公倍数 xx = gcd( lcm, a[i] ); lcm *= ( a[i]/xx ); } int cnt,flag; cnt = 0; for(int j= n%lcm + 1; j<= n%lcm + lcm; j++){// 当x>余数,(yu+1 - yu+lcm) 分 n/lcm 个段 flag = 0; for(int i=1; i<=m; i++){ if( j %a[i] == b[i]){ flag = 1; }else{ flag = 0; break; } } if(flag) cnt += n/lcm; //倍数 } for(int j=1; j<=n%lcm; j++){ //当x<余数,(1 - yu) flag = 0; for(int i=1; i<=m; i++){ if( j %a[i] == b[i]){ flag = 1; }else{ flag = 0; break; } } if(flag) cnt++; } printf("%d\n",cnt); } return 0; }
相关文章推荐
- HDU 1573 X问题 数论-(中国剩余定理)
- HDU 1573 X问题 数论
- HDU 1573 X问题 [一元线性同余方程组]【数论】
- HDU 1573 X问题(数论)
- HDU 1573 X问题 求同余方程组解的个数
- hdu 1573 X问题
- hdu——1573—— X问题
- HDU 1788(数论,求最小公倍数)
- 【数论 / 数值】【RQNOJ】最大公约数和最小公倍数问题
- 吃糖果 hdu 1205 数论中思维问题 鸽巢原理
- (step7.2.3)hdu 2554(N对数的排列问题——简单数论)
- hdu 1573 X问题 中国剩余定理(直接模板就OK了)
- (中国剩余定理) hdu 1573 X问题
- Hdu 1573 X问题
- hdu 1573 X问题 非互素的中国剩余定理应用
- hdu 1573 X问题 非互素的中国剩余定理应用
- (step7.2.3)hdu 2554(N对数的排列问题——简单数论)
- hdu 1573 X问题
- HDU 1573 X问题 (中国剩余定理解的个数)
- hdu 1573 X问题 中国剩余定理