我正在尝试解决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;
}
答案 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;