SPOJ给出了这个解决方案的错误答案

时间:2014-07-12 11:14:44

标签: algorithm

我正在尝试解决NGON问题。我在这里使用自下而上的动态编程。递归功能是:

f(a,b) = f(a-1,b) + f(a-1,b-1)*ai +f(a-1,b-2)*ai*(ai-1)/2, a>0,b>0
f(a,0) = 1,
f(0,b) = 0, 

ai是ath方面的分数。

但我得错了答案。我知道很难通过别人的代码,但我真的很感激任何帮助。我觉得我已经照顾到了溢出物。如果有任何优化也可以建议。

#include<stdio.h>
#define MAX 1010
#define MODULO 1000000007

int main()
{
    int test_cases,i,a,b;
    int sides,points[MAX];
    unsigned long long int result[MAX][MAX],temp;
    for(scanf("%d",&test_cases);test_cases>0;test_cases--)
    {
        scanf("%d",&sides);
        for(i=0;i<sides;i++)
        {
            scanf("%d",&points[i]);
        }

        result[0][0]=1;
        for(a=1;a<=sides;a++)
        {
            result[a][0]=1;
            result[0][a]=0;
        }

        for(a=1;a<=sides;a++)
        {
            for(b=1;b<=sides;b++)
            {
                if(b>2*a)
                {
                    result[a][b]=0;
                }
                else
                {
                    result[a][b]=(result[a-1][b]+result[a-1][b-1]*points[a-1])%MODULO;
                    if(b>1)
                    {
                        temp=(result[a-1][b-2]*points[a-1]*(points[a-1]-1))%MODULO;
                        temp=temp>>1;
                        result[a][b]=(result[a][b]+temp)%MODULO;
                    }
                }
            }
        }
        printf("%lld\n",result[sides][sides-1]);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

我认为这些问题可能存在问题:

temp=(result[a-1][b-2]*points[a-1]*(points[a-1]-1))%MODULO;
temp=temp>>1;

问题是在使用模运算时划分时需要格外小心。

例如,考虑x / 2模100.这与x modulo 100除以2不同。

假设x为100,

x/2 % 100 = 100/2 % 100 = 50 % 100 = 50

(x % 100)/2 = (100%100)/2 = 0/2 = 0

在计算模数之前尝试进行除法:

temp=(result[a-1][b-2]*((points[a-1]*(points[a-1]-1))>>1))%MODULO;