题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1573;
本题是杭电为数不多的中文题之一,所以意思很明朗;
分析:题目给的很清楚,就是求一次同余方程,我还是使用比较擅长的扩展欧几里得算法解答的
代码:
#include <set> #include <map> #include <stack> #include <queue> #include <math.h> #include <vector> #include <string> #include <utility> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> #include <functional> using namespace std; long long gcd(long long a,long long b){ if(b==0)return a; return gcd(b,a%b); } void _gcd(long long a,long long b,long long &x,long long &y){ if(b==1){ x=1; y=1-a; } else{ long long x1,y1; _gcd(b,a%b,x1,y1); x=y1; y=x1-(a/b)*x; } } long long a[50],b[50]; int main(){ int t; cin>>t; while(t--){ long long n,m; cin>>n>>m; for(int i=0;i<m;i++) cin>>a[i]; for(int i=0;i<m;i++) cin>>b[i]; long long a1,a2,b1,b2; a1=a[0],b1=b[0]; int flag=0; long long x,y; long long _a,_b; long long c; for(int i=1;i<m;i++){ a2=a[i],b2=b[i]; // cout<<b2<<endl; long long g=gcd(a1,a2); c=b2-b1; if(c%g!=0){ flag=1; break; } c/=g; _a=a1/g; _b=a2/g; _gcd(_a,_b,x,y); x=(x*c%_b+_b)%_b; x=x*a1+b1; b1=x; a1=_b*a1; } // cout<<a1<<" "<<b1<<endl; if(flag==1||n-b1<0)cout<<0<<endl; else if(b1!=0) cout<<(n-b1)/a1+1<<endl; else cout<<(n-b1)/a1<<endl; } return 0; }本题和另一个杭电上的题是相似的,不同的是本题要把a,b存起来而另一个不用
这是那个题的链接:http://blog.csdn.net/qq_27599517/article/details/50848176