您的位置:首页 > 其它

URAL 1035 Lucky Tickets

2015-08-09 12:02 585 查看
题意:长度为2n的数字,前N位之和和后面的一样,,,加一起是s........问有多少种不同的数字

首先s是奇数肯定就不行了。。。。

然后n*2*9<s也不行了。。。。。。

dp[i][j]+=dp[i-1][j-k];就是加的这位不同的情况·~~~

这题要用高精度,,,,

#include<stdio.h>

#include<string.h>

#include <algorithm>

#include <bits/stdc++.h>

using namespace std;

const int N = 550;

const int M = 50;

const int inf = 10000;

int dp[M+5]
[M+5];

void add(int a[M+1], int b[M+1]){

    int i;

    for(i = 1; i <= M; i++){

        a[i] += b[i];

    }

    for(i = 1; i <= M; i++){

        a[i+1] += a[i]/inf;

        a[i] %= inf;

    }

}

void mul(int a[M+1], int b[M+1]){

    int c[2*M+1], i, j;

    memset(c, 0, sizeof(c));

    for(i = 1; i <= M; i++)

        for(j = 1; j <= M; j++)

            c[i+j-1] += a[i]*b[j];

    for(i = 1; i <= M; i++){

        c[i+1] += c[i]/inf;

        c[i] %= inf;

    }

    for(i = 1; i <= M; i++)

        a[i] = c[i];

}

void display(int a[M+1]){

    int j, i = M;

    while(a[i] == 0 && i > 0)    i--;

    if(i == 0)    printf("0\n");

    else{

        printf("%d", a[i]);

        for(j = i-1; j > 0; j--){

            printf("%04d", a[j]);

        }

    }

    printf("\n");

}

int main()

{

    int n, s, i, j, k;

    while(~scanf("%d%d", &n, &s))

    {

        if(s&1)

        {

            printf("0\n");

            continue;

        }

        else

        {

            memset(dp, 0, sizeof(dp));

            for(i = 0; i < 10; i++)

                dp[1][i][1] = 1;

            for(i = 1; i <= n; i++)

                for(j = 0; j <= s/2; j++)

                    for(k = 0; k <= 9 && j >= k; k++)

                        add(dp[i][j], dp[i-1][j-k]);

            mul(dp
[s/2], dp
[s/2]);

            display(dp
[s/2]);

        }

    }

    return 0;

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: