40分求助
查看原帖
40分求助
768712
liuzhuoxin楼主2023/8/2 21:24
#include<bits/stdc++.h>
using namespace std;
int N, m1, m2, s[10005];
struct factor
{
	int index[205], base[205], sum;
}M, S[10005];
void doit( int num, int t, bool flag, int id )
{
	int idx = 0;
	for( int i = 2; i <= num / i; i++ )
	{
		if( num % i == 0 )
		{
			int cnt = 0;
			while( num % i == 0 )
				cnt++, num /= i;
			if( !flag )
				M.base[++idx] = i, M.index[idx] = cnt * t;
			else
				S[id].base[++idx] = i, S[id].index[idx] = cnt * t;
		}
	}
	if( num > 1 )
	{
		if( !flag )
			M.base[++idx] = num, M.index[idx] = t;
		else
			S[id].base[++idx] = num, S[id].index[idx] = t;
	}
	if( !flag )
		M.sum = idx;
	else
		S[id].sum = idx;
	return;
}
int f( int a, int b )
{
	int step = 1;
	while( a < b )
	{
		a *= 2;
		step++;
	}
	return step;
}
int cal( int id )
{
	for( int i = 1; i <= M.sum; i++ )
	{
		int idx = lower_bound( S[id].base + 1, S[id].base + S[id].sum + 1, M.base[i] ) - S[id].base;
		if( S[id].base[idx] != M.base[i] )
			return -1;
	}
	int ans = 0;
	for( int i = 1; i <= M.sum; i++ )
	{
		int idx = lower_bound( S[id].base + 1, S[id].base + S[id].sum + 1, M.base[i] ) - S[id].base;
		ans = max( ans, f( S[id].index[idx], M.index[i] ) );
	}
	return ans;
}
int main()
{
	scanf( "%d%d%d", &N, &m1, &m2 );
	for( int i = 1; i <= N; i++ )
		scanf( "%d", &s[i] );
	if( m1 == 1 )
	{
		printf( "%d", 0 );
		return 0;
	}
	doit( m1, m2, 0, 0 );
	for( int i = 1; i <= N; i++ )
		doit( s[i], 1, 1, i );
	int minstep = INT_MAX;
	for( int i = 1; i <= N; i++ )
	{
		int x = cal(i);
		if( x == -1 )	
			continue;
		minstep = min( minstep, x );
	}
	printf( "%d", minstep == INT_MAX ? -1 : minstep );
	return 0;
}
2023/8/2 21:24
加载中...