使用递推解题:EOJ2999

题目:

Description

给定一个多项式 (ax+by)k,计算多项式展开后 xny项的系数。

Input

第1行:一个整数T(1≤T≤10)为问题数。

接下来共T行。每行5个整数,分别为a,b,k,n,m,整数之间由一个空格分隔。

0≤k≤1,000,0≤n,m≤k,且n+m=k,0≤a,b≤1,000,000。

Output

对于每个问题,输出一行问题的编号(0开始编号,格式:case #0: 等)。

然后对应每个问题在一行中输出一个整数,表示所求的系数(这个系数可能很大,输出对10007取模后的值)。

Sample Input

3

2 5 290 130 160

235823 382573 999 111 888

1 1 3 1 2

Sample Output

case #0:

1580

case #1:

1952

case #2:

3

#include <stdio.h>
#include <stdlib.h>

const int mo=10007;
int ans[1010][1010];
int a,b,k,n,m,i,j,d=0;
int count;

void main()
{
    scanf("%d",&count);
    while(count--){
        scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
        a=a%mo;
        b=b%mo;
        ans[0][0]=1;
        for(i=1;i<n+1;i++)
        {
            ans[i][0]=a*ans[i-1][0]%mo;
        }
        for(j=1;j<m+1;j++)
        {
            ans[0][j]=b*ans[0][j-1]%mo;
        }
        for(i=1;i<n+1;i++){
            for(j=1;j<m+1;j++){
                ans[i][j]=(a*ans[i-1][j]+b*ans[i][j-1])%mo;
            }
        }

        printf("case #%d:\n%d\n",d++,ans[n][m]);
    }
}

刚开始想要用递归来做但是超时。

int cc(int k, int n)
{
    int result=0;
    if(k==0 || k==n)
    {
        result = 1;
        return result;
    }
    else
    {

        result = (cc(k,n-1)+cc(k-1,n-1))%10007;
        return result;

    }
}
时间: 2024-10-24 13:06:10

使用递推解题:EOJ2999的相关文章

HDU 2013(递推&amp;递归_D题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2013 ----------------------------------------------------------------------------------- 题意:每天吃掉一半再多一个,给出第几天吃到只剩一个,求开始时的数量. 思路:递推.按照每天的处理方式反向处理一下,最终得到结果. 代码: #include<cstdio> #include<cstring> #in

HDU 2045(递推&amp;递归_B题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2045 ----------------------------------------------------------------------------------- 题意:3种颜色,方格涂色,从左到右,最后一个方格颜色不能和第一个方格颜色相等,相邻颜色不能相同. 思路:最开始思路想简单了,以为第一个方格3种颜色,第二个方格到倒数第二个方格都是2种选择,最后一个方格一种选择.但是,这种递推需要

uva 1478 - Delta Wave(递推+大数+卡特兰数+组合数学)

题目链接:uva 1478 - Delta Wave 题目大意:对于每个位置来说,可以向上,水平,向下,坐标不能位负,每次上下移动最多为1, 给定n问说有多少种不同的图.结果对10100取模. 解题思路:因为最后都要落回y=0的位置,所以上升的次数和下降的次数是相同的,并且上升下降的关系满足出栈入栈的关系.即卡特兰数. 所以每次枚举i,表示有i个上升,i个下降,用组合数学枚举出位置,然后累加求和. C(2?in)?f(i)=C(2?i?2n)?f(i?1)?(n?2?i+1)?(n?2?i+2)

UVA - 10304Optimal Binary Search Tree(递推)

题目:UVA - 10304Optimal Binary Search Tree(递推) 题目大意:给出一组数,e1 < e2 < ... < en,现在要求将这些数组成一棵二叉搜索树,并且使得sum (ei * cost(ei))最小.cost(ei)表示ei到到根节点之间有多少条边. 解题思路:首先二叉搜索树要满足左节点小于根节点,右节点大于根节点.因此对于e1 < e2 < ... < en这样一组数,我们只要枚举根节点的位置ek,将这个序列分成左右子树两部分(e

UVA - 620Cellular Structure(递推)

题目:UVA - 620Cellular Structure(递推) 题目大意:只能给出三种细胞的增殖方式,然后给出最后细胞的增殖结果,最后问你这是由哪一种增殖方式得到的.如果可以由多种增殖方式得到,就输出题目中列出来的增殖方式靠前的那种. 解题思路:也是递推,细胞长度长的可以由细胞长度短的推得,并且这里第一种只能是长度为1的细胞才有可能,所以判断的时候可以3个判断,看能否与上面的增殖结果匹配,可以的话就记录下来,以后的长串就是由这样的短串再加上两个细胞继续往后推. 例如: BAABA 将A变为

UVA - 590Always on the run(递推)

题目:UVA - 590Always on the run(递推) 题目大意:有一个小偷现在在计划着逃跑的路线,但是又想省机票费.他刚开始在城市1,必须K天都在这N个城市里跑来跑去,最后一天达到城市N,问怎样计划路线的得到最少的费用. 解题思路:一开始题目意思就理解有些问题. dp[k][i]:代表在第k天小偷从某一个城市(除了i)坐飞机飞到城市i(到达城市i也是在这一天).第k天的话,就看这一天坐哪个航班,加上之前的费用是最小的,就选这个方案.然后k+ 1天就又是由第k天推出来的. 状态转移方

uva10891 - Game of Sum(递推,极大极小的思想)

题目:uva10891 - Game of Sum(递推) 题目大意:给出N个数,然后有两个小伙伴在玩游戏,每次可以从这一排数字的两侧中选择一侧开始取连续的数,必须取一个,也可以取完.这两个小伙伴都会采用最优的策略来取数,问第一个小伙伴取数的和与第2个小伙伴取数的和的差值. 解题思路:这题刚开始没什么头绪,只要碰到博弈思想的题目就没什么想法.看了别人的题解才明白. 先从简单的情况来讲如果每个小伙伴只能从两侧的一侧取一个数的话, dp[i][j]:小伙伴在第i个数字到第j个数字能取得的最大值: s

uva 1485 - Permutation Counting(递推)

题目链接:uva 1485 - Permutation Counting 题目大意:给定n和k,要求求一个由1~n组成的序列,要求满足ai>i的i刚好有k个的序列种数. 解题思路:dp[j][i]表示长度为i,j个位置满足的情况. dp[j+1][i]+=dp[j][i]?(j+1); 1, (3), (4), 2: 括号位置代表ai>i,既满足位置,此时i = 4, j = 2. -> 1, (3), (4), 2, 5 1 种,在最后追加 -> 1, (5), (4), 2,

从一道NOI练习题说递推和递归

一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶,编程计算共有多少种不同的走法. 这个问题可以用递归来进行解决,但是解题时间1秒明显不够用.怎么办呢,可以考虑找到“规律”,然后推导公式解决问题,开始画图分析: 这是4个台阶时的全部7种走法,记作f(4)=7.现在观察右侧绿色走过的部分,1234四种情况是3个台阶时的4种走,法记