Add Again

来源:互联网 发布:数据分析师的工作内容 编辑:程序博客网 时间:2024/06/13 20:54

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=31675#problem/G

不重复全排列出现个数公式:sum[ n ] = Exp[ n - 1 ] / ( [ EXP[ NUM[  i  ] - 1 ] * (Exp[ num[ i + 1 ] * ( EXP【 num[ i + 2 ] ) * (。。。。))* i ;

其中EXP代表阶乘,num【 i 】 代表i的个数;

算出其中一位的总和,总数为各个数的总和累加求得

#include<map>#include<set>#include<list>#include<cmath>#include<ctime>#include<deque>#include<stack>#include<bitset>#include<cstdio>#include<vector>#include<cstdlib>#include<cstring>#include<iomanip>#include<numeric>#include<sstream>#include<utility>#include<iostream>#include<algorithm>#include<functional>using namespace std ;#define INT unsigned long long const int maxn = 20005 ;INT Exp[ 20 ] = { 1 } ; INT temp[ maxn ] , num[ maxn ] ;void Union(){for( int i = 1 ; i < 15 ; ++i ){Exp[ i ] = Exp[ i - 1 ] * i ;}}  int main(){Union() ; int Case , n , temp1 ;INT sum , ans ; while( scanf( "%d" , &n ) != EOF && n ){memset( temp , 0 , sizeof( temp ) ) ;memset( num , 0 , sizeof( num ) ) ;int k = 0 ;for( int i = 0 ; i < n ; ++i ){scanf( "%d" , &temp1 ) ;temp[ temp1 ]++ ;if( temp[ temp1 ] == 1 ){num[ k++ ] = temp1 ;}}sum = 0 ; for( int i = 0 ; i < k ; ++ i ){ans = Exp[ temp[ num[ i ] ] - 1 ] ; for( int j =  0 ; j < k ; ++j ){if( j != i ){ans *= Exp[ temp[ num[ j ] ] ] ;}}sum += ( Exp[ n - 1 ] /  ans ) * num[ i ] ;//ͳ¼Æ¸öÊýºó³ËÉϸÃÊý }INT ans = sum ;for( int i = 1 ; i < n ; ++i ){ans = ans * 10 + sum  ;} printf( "%llu\n" , ans ) ; } return 0 ;}


原创粉丝点击