Advertisement
BoxerTC

5063 Just Sum It

Oct 4th, 2014
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define sc( x ) scanf( "%d" , &x )
  5. #define REP( i , n ) for( int i = 0 ; i < n ; ++i )
  6. #define clr( t , val ) memset( t , val , sizeof( t ) )
  7.  
  8. #define pb push_back
  9. #define all( v ) v.begin() , v.end()
  10. #define SZ( v ) ((int)(v).size())
  11.  
  12. #define mp make_pair
  13. #define fi first
  14. #define se second
  15.  
  16. #define MOD 1000000007LL
  17.  
  18. typedef pair< int , int > pii;
  19. typedef long long ll;
  20. typedef vector< int > vi;
  21.  
  22. ll C[ 105 ][ 105 ];
  23. int F[ 15 ];
  24. ll TEN[ 105 ];
  25. bool used[ 105 ][ 15 ][ 15 ];
  26. ll memo[ 105 ][ 15 ][ 15 ];
  27. ll DP[ 105 ][ 15 ][ 15 ];
  28.  
  29. ll dp( int L , int dig , int d ){
  30.     if( L == 0 ) return 1;
  31.     if( dig == 10 ) return 0;
  32.    
  33.     if( used[ L ][ dig ][ d ] ) return memo[ L ][ dig ][ d ];
  34.     used[ L ][ dig ][ d ] = 1;
  35.     ll &dev = memo[ L ][ dig ][ d ] = 0;
  36.     for( int i = 0 ; i <= min( F[ dig ] - (dig == d) , L ) ; ++i ) dev = ( dev + C[ L ][ i ] * dp( L - i , dig + 1 , d ) )%MOD;
  37.     return dev;
  38. }
  39.  
  40. int main(){
  41.     TEN[ 0 ] = 1;
  42.     for( int i = 1 ; i <= 100 ; ++i ) TEN[ i ] = ( TEN[ i - 1 ] * 10 )%MOD;
  43.     REP( i , 101 ) C[ i ][ i ] = C[ i ][ 0 ] = 1;
  44.     for( int i = 2 ; i <= 100 ; ++i )
  45.         for( int j = 1 ; j < i ; ++j ) C[ i ][ j ] = ( C[ i - 1 ][ j - 1 ] + C[ i - 1 ][ j ] )%MOD;
  46.     int cases;
  47.     cin >> cases;
  48.     REP( tc , cases ){
  49.         ll S = 0;
  50.         for( int i = 1 ; i <= 9 ; ++i ) {
  51.             cin >> F[ i ];
  52.             S += F[ i ];
  53.         }
  54.         clr( used , 0 );
  55.         ll ans = 0;
  56.         for( int i = 1 ; i <= S ; ++i ){
  57.             for( int j = 0 ; j < i ; ++j ){
  58.                 for( int d = 1 ; d <= 9 ; ++d )
  59.                     if( F[ d ] ){  
  60.                        
  61.                         //clr( used , 0 );
  62.                         ll a = ( dp( i - 1 , 1 , d ) * TEN[ j ] )%MOD;
  63.                         ans = ( ans + a * (ll)d )%MOD;
  64.                        
  65.                         /*
  66.                         for( int L = 0 ; L <= S ; ++L ) DP[ L ][ 10 ] = 0;
  67.                         for( int dig = 1 ; dig <= 10 ; ++dig ) DP[ 0 ][ dig ] = 1;
  68.                        
  69.                         for( int L = 1 ; L <= i ; ++L )
  70.                             for( int dig = 9 ; dig >= 1 ; --dig ){
  71.                                 DP[ L ][ dig ] = 0;
  72.                                 for( int k = 0 ; k <= min( F[ dig ] , L ) ; ++k ) DP[ L ][ dig ] = ( DP[ L ][ dig ] + C[ L ][ k ] * DP[ L - k ][ dig + 1 ] )%MOD;
  73.                             }
  74.                         ll a = ( DP[ i - 1 ][ 1 ] * TEN[ j ] )%MOD;
  75.                         ans = ( ans + a * (ll)d )%MOD;
  76.                         */
  77.                        
  78.                     }
  79.             }
  80.         }
  81.         cout << ans << '\n';
  82.     }  
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement