为什么会是10分啊??!!( 蒟蒻求助 )
查看原帖
为什么会是10分啊??!!( 蒟蒻求助 )
768712
liuzhuoxin楼主2023/7/9 15:33
#include<bits/stdc++.h>
using namespace std;
int n, m, a[100005], b[100005], c[100005];
string S[105][105];
clock_t start, finish;
string toString( int x )
{
    string res = "";
    while(x)
    {
        res = (char)( x % 10 + '0' ) + res;
        x /= 10;
    }
    return res;
}
string add( string stra, string strb )
{
    memset( a, 0, sizeof(a) );
    memset( b, 0, sizeof(b) );
    memset( c, 0, sizeof(c) );
    for( int i = 0; i < (int)stra.size(); i++ )
        a[i+1] = stra[ stra.size() - i - 1 ] - '0';
    for( int i = 0; i < (int)strb.size(); i++ )
        b[i+1] = strb[ strb.size() - i - 1 ] - '0';
    int lenc = 0, x = 0;
    while( lenc <= (int)stra.size() || lenc <= (int)strb.size() )
    {
        c[lenc] = a[lenc] + b[lenc] + x;
        x = c[lenc] / 10;
        c[lenc] %= 10;
        lenc++;
    }
    c[lenc] = x;
    while( c[lenc] == 0 )   lenc--;
    string res = "";
    for( int i = lenc; i >= 1; i-- )
        res = res + (char)( c[i] + '0' );
    return res;
}
string mul( string stra, string strb )
{
    memset( a, 0, sizeof(a) );
    memset( b, 0, sizeof(b) );
    memset( c, 0, sizeof(c) );
    for( int i = 0; i < (int)stra.size(); i++ )
        a[i+1] = stra[ stra.size() - i - 1 ] - '0';
    for( int i = 0; i < (int)strb.size(); i++ )
        b[i+1] = strb[ strb.size() - i - 1 ] - '0';
    int lenc = (int)stra.size() + (int)strb.size();
    for( int i = 1; i <= (int)stra.size(); i++ )
    {
        int x = 0;
        for( int j = 1; j <= (int)strb.size(); j++ )
        {
            c[ i + j - 1 ] += a[i] * b[j] + x;
            x = c[ i + j - 1 ] / 10;
            c[ i + j - 1 ] %= 10;
        }
        c[ i + (int)strb.size() ] += x;
    }
    while( c[lenc] == 0 )   lenc--;
    string res = "";
    for( int i = lenc; i >= 1; i-- )
        res = res + (char)( c[i] + '0' );
    return res;
}
int main()
{
    S[0][0] = "1";
    for( int i = 1; i <= 100; i++ )
        S[i][0] = S[0][i] = "0";
    for( int i = 1; i <= 100; i++ )
        for( int j = 1; j <= i; j++ )
            S[i][j] = add( mul( toString(j), S[i-1][j] ), S[i-1][j-1] );
    while( scanf( "%d%d", &n, &m ) != EOF )
    {
        if( n < m )
            printf( "0\n" );
        printf( "%s\n", S[n][m].c_str() );
    }
    return 0;
}
2023/7/9 15:33
加载中...