p2709_枚举.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 97 行

CPP
97
字号
#include <iostream>
#include <string.h>

using namespace std;

typedef unsigned long long int64;

struct TState {
       int    s [26] , n;
       int &  operator [] ( int Index ) { return s [Index]; }
       int    operator [] ( int Index ) const { return s [Index]; }
       int64  p ( TState & );
       void   print ();
       void   init ();
};

int    N;
TState Start , Min , Max;

int64 c ( int , int );
int64 gcd ( int64 , int64 );
void  solve ();

main ()
{
     while ( cin >> N ) {
           solve ();
           cout << endl;
     }
}

int64 gcd ( int64 a , int64 b )
{
      if ( b == 0 ) return a;
      return gcd ( b , a % b );
}

void solve ()
{
     Start.init ();
     Min = Max = Start;
     
     TState    TmpF;
     bool      first = true;
     
     for ( int j = Start.n; j < N; j ++ ) {
         first = true;
         for ( int i = 0; i < 26; i ++ ) if ( Min [i] ) {
             Min [i] ++;
             if ( first || Min.p ( Start ) < TmpF.p ( Start )) TmpF = Min;
             first = false;
             Min [i] --;
         }
         Min = TmpF;
         for ( int i = 0; i < 26; i ++ ) if ( Max [i] ) {
             Max [i] ++;
             if ( first || Max.p ( Start ) > TmpF.p ( Start )) TmpF = Max;
             first = false;
             Max [i] --;
         }
         Max = TmpF;
     }
     Max.print ();
     Min.print ();
}

int64 TState :: p ( TState & B )
{
      int64 Ret = 1;
      for ( int i = 0; i < 26; i ++ ) if ( s [i] )
          Ret *= c ( s [i] , B [i] );
      return Ret;
}

int64 c ( int a , int b )
{
      if ( a - b < b ) b = a - b;
      int64 Ret = 1;
      for ( int i = 1; i <= b; i ++ ) Ret = Ret * ( a - i + 1 ) / i;
      return Ret;
}

void  TState :: init ()
{
      char   str [200];
      cin >> str;
      n = strlen ( str );
      memset ( s , 0 , sizeof ( s ));
      for ( int i = 0; i < n; i ++ ) s [str [i] - 'A'] ++;
}

void TState :: print ()
{
     int64 Down = c ( N , Start.n ) , Up = p ( Start ) , g = gcd ( Down , Up );
     cout << Up / g << '/' << Down / g << endl;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?