Total Submission(s) : 32 Accepted Submission(s) : 15
Problem Description
求在小于等于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)。
Input
输入数据的第一行为一个正整数T,表示有T组测试数据。每组测试数据的第一行为两个正整数N,M (0 < N <= 1000,000,000 , 0 < M <= 10),表示X小于等于N,数组a和b中各有M个元素。接下来两行,每行各有M个正整数,分别为a和b中的元素。
Output
对应每一组输入,在独立一行中输出一个正整数,表示满足条件的X的个数。
就是中国剩余定理不互质的情况 套模板就可以了
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef long long ll; bool flag; ll m[100],a[100],lcm; ll gcd(ll a,ll b){ return b ? gcd(b,a%b) : a; } ll ex_gcd(ll a,ll b,ll &x,ll &y){ if(!b){ x = 1; y = 0; return a; } ll g = ex_gcd(b,a%b,y,x); y -= a / b * x; return g; } ll China(ll n){ ll m1 = m[0],a1 = a[0]; ll m2,a2,k1,k2,x0,g,c; lcm = m[0]; for(int i = 1; i < n; i++){ m2 = m[i]; a2 = a[i]; c = a2 - a1; g = ex_gcd(m1,m2,k1,k2); lcm = lcm * m[i] / gcd(lcm,m[i]); if(c % g){ flag = false; return 0; } x0 = k1 * c / g; ll t = m2 / g; x0 = (x0 % t + t) % t; a1 += m1 * x0; m1 = m2 / g * m1; } return a1; } int main(){ int T; scanf("%d",&T); while(T--){ ll N; int n; scanf("%lld%d",&N,&n); for(int i = 0; i < n; i++) scanf("%lld",&m[i]); for(int i = 0; i < n; i++) scanf("%lld",&a[i]); flag = true; ll ans = China(n); if(!flag || ans > N){ printf("0 "); } else{ if(ans <= 0) ans += lcm; ans = (N - ans) / lcm + 1; printf("%lld ",ans); } } return 0; }