我有两个类型为
的向量 typedef long long LL ;
vector < LL > store1 , store2 ;
每个载体的大小&lt; = 20000。 现在我需要提取所有这样的对(store1中的一个元素和store2中的一个元素),以便
gcd ( element1 ,element2 ) != 1 ;
来自任一商店的每个元素仅使用一次即可形成一对。
我目前使用的方法非常慢。 我的方法;
ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }
vector < LL > :: iterator it , fit ;
LL ans = 0 ;
// count of pairs
for ( it = store1.begin() ; it != store1.end() ; it++)
{
LL x = (*it) ;
for( fit = store2.begin() ; fit != store2.end() ; fit++){
LL y = (*fit) ;
if ( gcd(x,y) != 1){
ans++ ;
store2.erase(fit); break ;
}
}
}
时间限制:1秒 所有数字都是&lt; = 10 ^ 9
我使用64位整数类型来避免任何类型的溢出。
你可以看到,这样的对不能超过20000对。我遵循O(n ** 2)方法,这对我的申请来说太慢了。
晚编辑: 我想知道是否存在gcd的某些属性,通过该属性可以更快地提取对。数论概念的应用可以用来降低复杂性。