题意:给出一个递增的时间序列a 给出另外一个序列b (都是整数)
以b中任选一个数字作为间隔 自己从1开始任选一个时间当成开始时间
输出选择的数字标号以及 开始时间
思路 直接求间隔的公共gcd 然后看 给的序列b 中有没有数 b[i]|gcd 即可
如果没有则输出-1

1 #include<bits/stdc++.h> 2 #define mkp make_pair 3 #define pb push_back 4 #define F first 5 #define S second 6 using namespace std; 7 typedef long long ll; 8 const int maxn=3e5+5; 9 ll a[maxn],b[maxn]; 10 vector<pair<ll,ll> >v; 11 ll gcd(ll a,ll b){ 12 return b==0?a:gcd(b,a%b); 13 } 14 int main(){ 15 int n,m; 16 scanf("%d%d",&n,&m); 17 ll tmp=1; 18 19 for(int i=1;i<=n;i++) 20 { 21 scanf("%lld",&a[i]); 22 23 } 24 for(int i=1;i<=n-1;i++){ 25 b[i]=a[i+1]-a[i]; 26 } 27 tmp=b[1]; 28 for(int i=2;i<=n-1;i++){ 29 tmp=gcd(b[i],tmp); 30 } 31 //cout<<tmp<<endl; 32 int ok=0; 33 for(int i=1;i<=m;i++) 34 { 35 ll zz; 36 37 scanf("%lld",&zz); 38 if(ok)continue; 39 if(tmp%zz==0){ 40 cout<<"YES\n"; 41 cout<<a[1]<<" "<<i<<endl; 42 ok=1; 43 } 44 //v.pb(mkp(zz,1ll*i)); 45 //cout<<i<<endl; 46 } 47 if(!ok) 48 cout<<"NO\n"; 49 50 51 /*sort(v.begin(),v.end()); 52 53 54 int p=lower_bound(v.begin(),v.end(),mkp(tmp,1ll*0))-v.begin(); 55 if(p>=v.size()){ 56 cout<<"NO\n"; 57 return 0; 58 } 59 else { 60 if(v[p].F!=tmp){ 61 // cout<<v[p].F<<endl; 62 cout<<"NO\n"; 63 return 0; 64 } 65 else{ 66 cout<<"YES\n"; 67 cout<<a[1]<<" "<<v[p].S<<endl; 68 } 69 }*/ 70 return 0; 71 }