sgu 491 357页

对于 a*x+b*y=N的一个方程,给出N的值(1<=N<=100 000),求使得方程存在正解的正整数对(a, b)的个数(,其中a<b)

先枚举a再枚举x。对于每个a算出所有可能的b,然后对于b去重。最后便可得到所有的(a,b)对个数。


const  int  maxn = 100000 ;
vector<int>  lis[maxn+8] ;
vector<int>  ::reverse_iterator rit ;
int  c[maxn*100]  ;

int  main(){
     int  i  ,  j  , n  , a , b , A , B , s  , t ;
     for(i = 1 ; i <= 100000 ; i++){
         for(j = i ; j <= 100000 ; j += i) lis[j].push_back(i)  ;
     }
     while(cin>>n){
          s = 0 ;
          for(a = 1 ; a <= n/2 ; a++){
              t =  0 ;
              for(A = a ; A < n ; A += a){
                  B = n - A  ;
                  for(rit = lis[B].rbegin() ; rit != lis[B].rend() && (b = *rit) > a ; rit++)
                       c[t++] = b ;
              }
              if(t){
                  sort(c , c+t) ;
                  s++ ;
                  for(i = 1 ; i < t ; i++){
                      if(c[i] != c[i-1]) s++  ;
                  }
              }
          }
          cout<< s <<endl ;
     }
     return 0 ;
}


你可能感兴趣的:(sgu 491 357页)