151023的测试总结

第一题

【题目及题号】分裂 superoj950
【题解】
根据均值不等式的推广可以证明把一个数分得越均匀产生的贡献越大。
所以就可以枚举将其分成多少份。
又因为正向求解比较复杂,所以我们考虑把n分成n个一产生的贡献减去把多少个1合并在一起减少的贡献。
最大产生的贡献为 n*(n-1)/2;
然后把n分成i份 each = n/i,rest = n%i;
现在相当于从rest个each中分别分一个一出来,减少的贡献为rest*(each*(each+1)/2);
然后把i-rest个1分在一起成为each,减少的贡献为(i-rest)(each(each-1)/2);
最后将剩下的贡献与m相比,如果能找到解则输出。

第二题

【题目及题号】异或计数 superoj951
【题解】
设a1^a2^……^an=sum
本题要考虑两个限制:
限制一:异或和最后要相同
限制二:不能大于a[i]
考虑限制二,如果ai当前这位为1,而我们取了0,那么意味着它之后的位数无论怎么取都可以满足限制二。
所以我们只考虑有一个数没有取满的情况。(少掉一种全部取满ai的情况直接+1就好)
f[i][j][k]表示到第i个数当前异或和为1是否有一个数已经没有取满的情况数。
考虑当前位为p,
a[i+1]的第p位为0
这一位只能取0,后面能取的方案数则为((a[i+1]&(2^(p-1)))+1)
a[i+1]的第p位为1
这一位可以取0或者1
如果取1,f[i][j][k]+((a[i+1]&(2^(p-1)))+1)转移到f[i+1][j^1][k];(表示取满)
如果取0,则表示有一个数没有取满,f[i+1][j][1] += f[i][j][k]*(2^(p-1));(表示后面所有数都能乱取)
最后ans = ans + f[n][sum[p]][1]/(2^(p-1));
表示到第n个数当前位异或和与sum相同的方案数,要除以2^(p-1)是因为
1***|#####
2***|#####
3***|#####
4***|#####
——-00000~11111
取到当前这个数时,后面的位全是尽可能地乱取的,为了满足异或和的条件我们需要让一个数能从00000~11111来保证前面的所有方案都可以合法。
所以让一个当前位可以为1的数为0,并舍掉它可以全部取满的贡献。所以除掉2^(p-1)即可。
假设当前位没有一个数为1,那么到最后一位一定是f[][][]=0,不会产生贡献。

第三题
【题目及题号】brainfuck superoj952
待填坑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值