米小游拿到了一个集合(集合中元素互不相等)。她想知道,该集合有多少个元素数量大于 11 的子集,满足子集内的元素两两之间互为倍数关系?由于数量可能过大,请对 109+710
for(int i=1;i<=1000000;i++){
if(vis[i]==0)continue;
for(int j=i+i;j<=1000000;j+=i){
if(vis[j])r[j].push_back(i);
}
}
for(int i=2;i<=n;i++){
for(auto u:r[a[i]]){
if(vis[u])sum[a[i]]=(sum[a[i]]+sum[u]+1)%mod;
}
}
把数组a递增排序
预处理这个数组间 的倍数关系 (nlog1000000)
再nlog 去dp一下
dp含义 :sum[x]表示以x元素作为结尾的方案数
转移方程:(条件:a中存在u,且a[i]是u倍数,u!=a[i])
sum[a[i]] += sum[u]+1;
代表u结尾的所有合法子集均添加一个a[i] 的方案数: sum[u]
以及单一个u的集合加 a[i] 也能构成新的合法集合的方案数: 1
故u对a[i]的贡献为 sum[u]+1
记得mod一下 :sum[a[i]]=(sum[a[i]]+sum[u]+1)%mod;
https://www.nowcoder.com/discuss/467094961188532224?sourceSSR=search