丧血槌 发表于 2025-6-4 16:56:25

P2150 [NOI2015] 寿司晚宴

思路:

注意到对于每个数,其 \(>19\) 的质因数最多只有 \(1\) 个,称为大质数;对于 \(\le 19\) 的质因数有 \(8\) 个,称为小质数。
设第 \(i\) 个数的小质数集合为 \(h_i\)。
那么考虑对于所有数按照大质数从小到大排序,那么对于大质数相同的一段,只能放在两个集合中的一个。
考虑状态压缩 \(dp\),定义 \(dp_{S_1,S_2}\) 表示对于取完 \(i\)(可以滚动数组) 个数后第一/二个集合的小质数集合,\(f1_{S_1,S_2}\) 表示这一段的数都放在第一个集合的方案数,\(f2_{S_1,S_2}\) 表示这一段的数都放在第二个集合的方案数。
则状态转移方程为(首先要满足 \(S_1\) 与 \(S_2\) 没有交集,即 \(S_1 \operatorname{and} S_2 = 0\)):

\\]

\\]

\
因为 \(f1\) 和 \(f2\) 都可以不取这一段的数,那么 \(dp_{S_1,S_2}\) 就被算了两次,减掉即可。
时间复杂度为 \(O(n2^{16})\)。
完整代码:

#include#define Add(x,y) (x+y>=mod)?(x+y-mod):(x+y)#define lowbit(x) x&(-x)#define pi pair#define pii pair#define iip pair#define ppii pair#define fi first#define se second#define full(l,r,x) for(auto it=l;it!=r;it++) (*it)=x#define Full(a) memset(a,0,sizeof(a))#define open(s1,s2) freopen(s1,"r",stdin),freopen(s2,"w",stdout);using namespace std;typedef double db;typedef unsigned long long ull;typedef long long ll;bool Begin;const ll N=505,M=8,S=(1ll

但婆 发表于 2025-12-11 12:17:10

感谢分享,学习下。

坠矜 发表于 2025-12-11 16:31:16

感谢发布原创作品,程序园因你更精彩

坐褐 发表于 2025-12-11 16:35:26

感谢分享,下载保存了,貌似很强大

仲水悦 发表于 2025-12-25 03:48:32

谢谢分享,辛苦了

饮邺谲 发表于 2026-1-18 05:00:58

谢谢楼主提供!

翁谌缜 发表于 2026-1-18 15:37:33

谢谢楼主提供!

挽幽 发表于 2026-1-18 19:07:13

鼓励转贴优秀软件安全工具和文档!

苗嘉惠 发表于 2026-1-20 20:18:05

收藏一下   不知道什么时候能用到

时思美 发表于 2026-1-21 02:41:29

谢谢分享,辛苦了

喳谍 发表于 2026-1-24 03:04:36

热心回复!

尚腱埂 发表于 2026-1-26 04:15:58

感谢,下载保存了

郗燕岚 发表于 2026-1-30 07:32:46

鼓励转贴优秀软件安全工具和文档!

羊夏菡 发表于 2026-2-2 18:21:26

感谢,下载保存了

梳踟希 发表于 2026-2-3 03:33:41

yyds。多谢分享

姬宜欣 发表于 2026-2-5 03:32:59

谢谢分享,辛苦了

宁觅波 发表于 2026-2-5 06:06:53

分享、互助 让互联网精神温暖你我

仰翡邸 发表于 2026-2-7 09:22:21

懂技术并乐意极积无私分享的人越来越少。珍惜

距佰溘 发表于 2026-2-7 23:56:09

感谢分享,下载保存了,貌似很强大

福清婉 发表于 2026-2-9 18:54:10

这个好,看起来很实用
页: [1] 2
查看完整版本: P2150 [NOI2015] 寿司晚宴