前提:
求最大公约数可以使用<algorithm>
中的方法__gcd()
但是只能求两个数的最大公约数
注意:
0和a(任意数字)的最大公约数是a
理论:
实际上可以嵌套多个函数,类似的使用max(max(a,b),c);
例如:__gcd(__gcd(a,b),c)
就能求得a,b,c三个数的最大公约数,设为gcd,其实这和辗转相除的原理类似(挑战程序设计竞赛114页)
证明:
假设a,b,c为一个长方体的长宽高,寻找最大的正方体(边长为gcd)能够将长方体填满。
于是正方体要先满足a,b构成的平面于是gcd1=__gcd(a,b),满足a,b的同时还要满足c,于是在gcd1的前提下gcd=__gcd(gcd1,c);
就像辗转相除通过最优数据进行假设测试计算来得到最后的数据
例题:
AC代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long a[1000000],b;
int main(){
long long n,m;
cin>>n>>m;
long long gcd=0;
for(long long i=0;i<n;i++)
{
scanf("%lld",&a[i]);
if(i>0){
gcd=__gcd(gcd,a[i]-a[i-1]);
}
}
long long item=0;
for(long long j=0;j<m;j++)
{
scanf("%lld",&b);
int f=0;
if(gcd%b==0&&item==0)item=j+1;
}
if(item==0)cout<<"NO";
else cout<<"YES"<<endl<<a[0]<<" "<<item;
return 0;
}