本文主要是介绍HDU - 1573 - 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)。
3 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
1 0 3
参考:
http://blog.csdn.net/fyxz1314/article/details/38497299
http://blog.csdn.net/u010579068/article/details/45422941
代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<queue>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;int n,m;
int M[15],A[15];void extend_Eculide(int a,int b,int &d,int &x,int &y)
{if(b==0){d=a;x=1;y=0;return;}extend_Eculide(b,a%b,d,y,x);y-=x*(a/b);
}int main()
{int i,T;int m1,r1,m2,r2,flag;int x,y,d,c,t;scanf("%d",&T);while(T--){cin>>n>>m;for(i=0;i<m;i++)cin>>M[i];for(i=0;i<m;i++)cin>>A[i];flag=0;m1=M[0]; r1=A[0];for(i=1;i<m;i++){m2=M[i]; r2=A[i];extend_Eculide(m1,m2,d,x,y);c=r2-r1;if(c%d){flag=1;break;}t=m2/d;x=(c/d*x%t+t)%t;r1=m1*x+r1;m1=m1*m2/d;}if(flag||n<r1){cout<<0<<endl;}else{int ans=(n-r1)/m1+1;if(r1==0)ans--;cout<<ans<<endl;}}return 0;
}
这篇关于HDU - 1573 - X问题 - (解线性同余方程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!