最大公因数——解題報告

1529 ワード

最大公約数(gcd.pas/c/cpp)TL:1 S ML:256 MB
【Description】 
N個の整数があり、kAcはそれらをQ回修正します. 
各変更は、すべての数に整数(正または負)を加算することを意味します.
修正するたびに、現在のすべての数の最大公約数がどれだけあるかを知りたいと思っています. 
【Input】 
1行目の2つの整数N,Q
次のN行は、行ごとに1つの整数で、このN個の数の初期値を表す. 
次のQ行は、行ごとに整数であり、このQ行を表す.i番目の数は、今回の操作がどれだけ増加したかを示します. 
【Output】 
共Q行は、i回目の操作を行った後、すべての数の最大公約数を示す
【Sample Input】 
3 2 
1 -5 7 
-1 

【Sample Output】 

1  
【Hint】 
40%:Nに対してQ<=1000
70%:Nに対してQ<=40000
100%:Nに対して、Q<=100000で、すべての数の絶対値は常に10^16以下である.
ここでは,任意の非負の整数xと0の最大公約数はxであると考えられる.
【問題解】
もし1つの数がこれらの数よりも因数であれば、それはすべての数の間の差の公因数に違いない.
だからそれらの2つを差(隣接すればよい)にして、これらの差の最大公因数を求めて、それから毎回a[1]だけを更新して、それと公因数を取って、それでいいです.
コード添付
#include
#include
#include
#include
#include
using namespace std;
int n,m;
int gcd(int a,int b)
{
	if(a==0)
		return b;
	if(b==0)
		return a;
	if(a%b==0)
		return b;
	else
		return gcd(b,a%b); 
}
int g[100050];
int main()
{
	//freopen("gcd.in","r",stdin);
	//freopen("gcd.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&g[i]);
	}
	int yu=abs(g[2]-g[1]);
	for(int i=3;i<=n;i++)
	{
		yu=gcd(yu,abs(g[i]-g[i-1]));
	}
	int hj;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&hj);
		g[1]+=hj;
		int ans=gcd(yu,abs(g[1]));
		cout<