1450时间能不能放长一点啊啊啊啊啊
查看原帖
1450时间能不能放长一点啊啊啊啊啊
188
Danjue楼主2013/8/19 18:10

四个物品容斥原理的太难写我就只写了两个的,程序长度只有他们的一半,复杂度也就比他们多乘了一个常数,结果就只能过三个点...

#include<cstdio>
#include<cstring>
using namespace std;
long long c[5],tot,d[5],dp1[110000],i,j,s,dp2[110000],ans1[110000],ans2[110000],prt;
int rt1(int p)
{
    if (p<0) return 0;
    return dp1[p];
}
int rt2(int p)
{
    if (p<0) return 0;
    return dp2[p];
}
int main()
{
    for (i=1; i<=4; i++) scanf("%I64d",&c[i]);
    scanf("%I64d",&tot);
    for (int ii=1; ii<=tot; ii++)
    {
        for (i=1; i<=4; i++) scanf("%I64d",&d[i]);
        scanf("%I64d",&s);
        memset(dp1,0,sizeof(dp1));
        dp1[0]=1;
        for (i=1; i<=2; i++)
          for (j=c[i]; j<=s; j++) 
        dp1[j]+=dp1[j-c[i]];
        for (i=0; i<=s; i++) ans1[i]=dp1[i]-rt1(i-c[1]*(d[1]+1))-rt1(i-c[2]*(d[2]+1))+rt1(i-c[1]*(d[1]+1)-c[2]*(d[2]+1));
        memset(dp2,0,sizeof(dp2));
        dp2[0]=1;
        for (i=3; i<=4; i++)
          for (j=c[i]; j<=s; j++) 
        dp2[j]+=dp2[j-c[i]];
        for (i=0; i<=s; i++) ans2[i]=dp2[i]-rt2(i-c[3]*(d[3]+1))-rt2(i-c[4]*(d[4]+1))+rt2(i-c[3]*(d[3]+1)-c[4]*(d[4]+1));
        prt=0;
        for (i=0; i<=s; i++) prt+=ans1[i]*ans2[s-i];
        printf("%I64d\n",prt);
    }
    return 0;
}
2013/8/19 18:10
加载中...