博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP模拟 整数划分(数论,质因数分解,状压DP)
阅读量:4943 次
发布时间:2019-06-11

本文共 1253 字,大约阅读时间需要 4 分钟。

这道题竟然暴力能拿到90分,大佬orzorzorz%%%%%%%%%%%

--------------------------分割线(下面是正解)---------------------------------

首先还是暴力,枚举选哪些数;

然后是正解:对于N,可以将它质因数分解为(a1^p1)*(a2^p2)*……*(ai^pi)的形式,因为要两两互质,那么令U={a1^p1,a2^p2,……,ai^pi},那么选出来的数一定是U的子集,且所有数取交为空集,取并为U,可以证明,i不会超过15,所以考虑状压DP来存储子集,转移也很简单。

贴代码:

#include
#include
#include
using namespace std;const int N=100005;pair
B[N]; long long mul,pow=1,F[1<<20],n;int mk[N],pri[N],ok[N],v[N],A[505],bit,cnt,num,m,k,tmp;void prime_shaker(){ for(int i=2;i
1) B[++tmp]=make_pair(x,1),v[++num]=x; return;}bool check(int x){ if(n%x) return 0; divide(x); for(int i=1;i<=tmp;i++) { mul=1; for(int j=1;j<=B[i].second;j++) mul=mul*B[i].first; if((n/mul)%B[i].first==0) return 0; } return 1;}int cal(int x){ int Ret=0; for(int i=0;i
1) { puts("0"); exit(0); } return;}int main(){ prime_shaker(); scanf("%lld%d",&n,&k); for(int x,i=1;i<=k;i++) { scanf("%d",&x); if(x==1) { pow=2; continue; } if(check(x)) A[++m]=x; } sort(v+1,v+num+1); for(int i=1;i<=num;i++) if(v[i]!=v[i+1]) v[bit++]=v[i]; check_zero(); for(int i=1;i<=m;i++) A[i]=cal(A[i]); F[0]=1; for(int i=0;i<(1<

 

转载于:https://www.cnblogs.com/Ishtar/p/10010853.html

你可能感兴趣的文章
算法笔记_145:拓扑排序的应用(Java)
查看>>
JS获取农历日期
查看>>
PHP中的HTTP协议
查看>>
CSS给文字描边实现发光文字
查看>>
Java WebService入门实例
查看>>
css样式之补充
查看>>
结构与联合
查看>>
关于JS历史
查看>>
软件架构师工作流程
查看>>
将txt文本转换为excel格式
查看>>
BUPT复试专题—众数(2014)
查看>>
css-sprite切割图片(加快网页加载速度)
查看>>
20145316 《信息安全系统设计基础》第十四周学习总结
查看>>
Liferay7 BPM门户开发之18: 理解ServiceContext
查看>>
从零开始学区块链(3)
查看>>
Intel Galileo development documentation
查看>>
Jquery特效
查看>>
web服务器
查看>>
EV: Workaround to Allow Only One Instance or Window of outlook
查看>>
数据校验,
查看>>