社区讨论
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 条回复,欢迎继续交流。
正在加载回复...