Pku 2917 Diophantus of Alexandria

Pku 2917 Diophantus of Alexandria

题意:
求 1/x+1/y=1/z x,y的整数解对数

做法:
先将y表示成 y=(x*z)/(x-z)
然后呢...我就不知道然后了
baidu了题解后才知道了
设w=x-z 则x=z+w 那么 y=(z*z+w*z)/w=z*z/w+z
所以转化为了求z*z/w的整数解个数
即z*z的约数个数  因为要求一对的 所以答案是 (约数个数+1)/2

然后就解决了。

 1  #include  < cstdio >
 2  #define  n 50005
 3  int  p[n],T,N,ret;
 4  bool  mk[n];
 5  inline  void  mkprime()
 6  {
 7       for  ( int  i = 2 ;i < n; ++ i)
 8       if  ( ! mk[i])
 9           for  ( int  j = i << 1 ;j < n;j += i)
10              mk[j] = 1 ;
11       for  ( int  i = 2 ;i < n; ++ i)
12       if  ( ! mk[i])    p[ ++ p[ 0 ]] = i;
13  }
14  inline  int  getlog( int   & N, int  prime)
15  {
16       int  ret = 0 ;
17       for  (;N % prime == 0 ;N /= prime, ++ ret);
18       return  ret;
19  }
20  int  main()
21  {
22      mkprime();
23      scanf( " %d " , & T);
24       for  ( int  Te = 1 ;Te <= T; ++ Te)
25      {
26          scanf( " %d " , & N);
27          ret = 1 ;
28           for  ( int  i = 1 ;i <= p[ 0 ] && p[i] * p[i] <= N; ++ i)
29           if  (N % p[i] == 0 )    ret *= (getlog(N,p[i]) << 1 ) + 1 ;
30           if  (N > 1 )    ret *= 3 ;
31          printf( " Scenario #%d:\n%d\n\n " ,Te,(ret + 1 ) >> 1 );
32      }
33       return   0 ;
34  }
35 


你可能感兴趣的:(Pku 2917 Diophantus of Alexandria)