社区讨论

1450时间能不能放长一点啊啊啊啊啊

P1450[HAOI2008] 硬币购物参与者 13已保存回复 17

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
17 条
当前快照
1 份
快照标识符
@lo0tionf
此快照首次捕获于
2023/10/22 09:56
2 年前
此快照最后确认于
2025/11/18 19:22
4 个月前
查看原帖
四个物品容斥原理的太难写我就只写了两个的,程序长度只有他们的一半,复杂度也就比他们多乘了一个常数,结果就只能过三个点...
CPP
#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;
}

回复

17 条回复,欢迎继续交流。

正在加载回复...