优化需要在条件后从两个不同的集合中提取数字对吗?

时间:2014-07-07 13:24:11

标签: c++ performance map stl

我有两个类型为

的向量
      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的某些属性,通过该属性可以更快地提取对。数论概念的应用可以用来降低复杂性。

0 个答案:

没有答案