Ural 1013 K-based numbers. Version 3

Ural 1013 K-based numbers. Version 3
通过这相似的三道题体会到了“量变引起质变”的道理。第一题数据规模很小,当然可以DP,但是搜索就足够了;第二题规模大了不少,高精度是必须的,同时需要用动态规划,递推和记忆化两种形式,我一直偏爱记忆化,选择了记忆化搜索;第三题规模继续增大,为了节省空间,高精度用到了压位存储,同时记忆化不再可行!因为会造成栈崩溃!改用递推。
以下是我的代码:
#include < stdio.h >
#include
< string .h >
#define  max_digit 300
#define  maxn 1801
typedef 
struct
{
    
long  n,s[max_digit];
}bign;
long  n,k;
bign d[maxn][
2 ];

void  Add(bign  & c,bign  & a,bign  & b)
{
    memset(c.s,
0 , sizeof (c.s));
    c.n
= (a.n > b.n ? a.n:b.n);
    
for ( long  i = 0 ;i < c.n;i ++ )
    {
        c.s[i]
+= a.s[i] + b.s[i];
        
if (c.s[i] >= 100000000 )
        {
            c.s[i
+ 1 ] += c.s[i] / 100000000 ;
            c.s[i]
%= 100000000 ;
        }
    }
    
if (c.s[c.n]) c.n ++ ;
}
void  Mul(bign  & c, long  t,bign  & a)
{
    memset(c.s,
0 , sizeof (c.s));
    c.n
= a.n;
    
for ( long  i = 0 ;i < c.n;i ++ )
        c.s[i]
= t * a.s[i];
    
for ( long  i = 0 ;i < c.n;i ++ )
        
if (c.s[i] >= 100000000 )
        {
            c.s[i
+ 1 ] += c.s[i] / 100000000 ;
            c.s[i]
%= 100000000 ;
        }
    
if (c.s[c.n]) c.n ++ ;
}
void  Print(bign  & a)
{
    printf(
" %ld " ,a.s[a.n - 1 ]);
    
for ( long  i = a.n - 2 ;i >= 0 ;i -- )
        printf(
" %08ld " ,a.s[i]);
}
int  main()
{
    scanf(
" %ld%ld " , & n, & k);
    d[n][
1 ].n = 1 ;d[n][ 1 ].s[ 0 ] = k;
    d[n][
0 ].n = 1 ;d[n][ 0 ].s[ 0 ] = k - 1 ;
    
for ( long  i = n - 1 ;i >= 1 ;i -- )
    {
        
if (i == 1 )
        {
            Mul(d[i][
1 ],k - 1 ,d[i + 1 ][ 1 ]);
            
continue ;
        }
        
        bign t;
        Mul(t,k
- 1 ,d[i + 1 ][ 1 ]);
        Add(d[i][
1 ],t,d[i + 1 ][ 0 ]);
        
        Mul(d[i][
0 ],k - 1 ,d[i + 1 ][ 1 ]);
    }
    Print(d[
1 ][ 1 ]);printf( " \n " );
return   0 ;
}


你可能感兴趣的:(Ural 1013 K-based numbers. Version 3)