首先,题目说了最多\(6\)个质因数

如此小的数据范围,不是状压还是啥?

然后,我们可以发现一个性质:只要两个因数有相同的质因数(不管次数是多少),两者就不互质

这启示我们用一个二进制数来表示一类\(N\)的因数,每个二进制位表示对应质因数的状态,\(1\)表示有,\(0\)表示没有。

举个例子:\(N=12156144=2^4 \times 3 \times 7 \times 11^2 \times 13 \times 23\)

那么,每个二进制数中,第\(0\)位表示是否有质因数\(2\),第\(1\)位表示是否有质因数\(3\),第\(2\)位表示是否有质因数\(7\)......以此类推。

比如说,\(N\)的因数\(132=2^2 \times 3 \times 11\),应该对应的是\({(001011)}_2\),即它属于第\(11\)类数。

状压以后,不难用乘法原理求出每类数的个数。接着,我们考虑如何求出答案。

我们用一个三进制数来表示当前状态。第\(i\)位表示当前第\(i\)类数的数量+与第\(i\)类不互质的数的个数。状态转移就很好写了。枚举当前增加哪一类数,直接转移即可。

最后有个要点:可以改成四进制数来写,并用一个\(int128\)来存,简化代码。

(Dev-C++是编译不通过的,因为这东西只有Linux下有)

Code:

#include <iostream>
#include <cstdio>
#include <map>
#define int long long
using namespace std;
typedef __uint128_t int128;
const int MOD=1e9+7;
int n,zys[105],cs[105],cnt,sum[1<<8],ans;
map<int128,int> m; //存状态
int dfs(int128 stat){
if(m.count(stat)) return m[stat];//记忆化
int res=1;
for(int i=1;i<(1<<cnt);i++){ //枚举增加的数是哪一类
int cur=(stat>>(i<<1))&3; //获取当前这一类数的情况
int128 tmp=stat;
if(cur>1) continue; //如果已经有数与它不互质了,显然不能再增加此类数
for(int j=0;j<(1<<cnt);j++){
if(!(i&j)) continue; //验证每一类数是否与所选的数互质
//如果这两类数有相同的质因子,则按位与肯定不为0
if((stat>>(j<<1)&3)<2) stat+=((int128)1<<(j<<1));
}
res=(res+dfs(stat)*sum[i])%MOD;
stat=tmp;
}
return m[stat]=res;
} signed main(){
scanf("%lld",&n);
int tmp=n;
for(int i=2;i*i<=tmp;i++){
if(tmp%i==0){
zys[++cnt]=i;
while(tmp%i==0) tmp/=i,cs[cnt]++; //分解质因数
//zys:存储从小到大不同的质因子
//cs:每一个质因子的次数
}
}
if(tmp>1) zys[++cnt]=tmp,cs[cnt]++;
for(int i=0;i<(1<<cnt);i++){
sum[i]=1;
for(int j=1;j<=cnt;j++){
if(i&(1<<j-1)) sum[i]=(sum[i]*cs[j])%MOD; //乘法原理,计算每一类数的个数
}
}
ans=dfs((int128)0);
cout<<(ans-1+MOD)%MOD<<endl;//空集不能算,所以答案-1
return 0;
}

【Luogu】 P6274 [eJOI2017]六 题解的更多相关文章

  1. 【luogu P5022 旅行】 题解

    题目连接:https://www.luogu.org/problemnew/show/P5022 \(NOIP2018 DAY2T1\) 考场上只写了60分,很容易想到当 m = n - 1 时的树的 ...

  2. 【luogu P2831 愤怒的小鸟】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2831 写点做题总结:dp,搜索,重在设计状态,状态设的好,转移起来也方便. 对于一条抛物线,三点确定.(0, ...

  3. 【luogu P2827 蚯蚓】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2827 35分:暴力sortO(mnlogn). 80分:考虑到每次不好维护不被切的点+q,正难则反.改成维护 ...

  4. 【luogu P3959 宝藏】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3959 我只是心血来潮想学SA(考场上骗分总行吧). 这个题可以状压DP.爆搜+剪枝.有意思的还是随机化搜索( ...

  5. 【luogu P3410 拍照】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3410 这个题就是求一个最大权闭合图 在一个图中,一些点构成一个集合,且集合中的出边指向的终点也在这个集合中, ...

  6. 【luogu P1113 杂务】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1113 菜 #include <queue> #include <cstdio> #i ...

  7. 【luogu P4114 Qtree1】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4114 1.把边权转化到点权:选取连接这条边的两个点中较深的一个. 2.查询点到点之间的边权时,要从seg[x ...

  8. 【luogu P3979 遥远的国度】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3979 除了换根操作都是裸的树剖 所以换根时考虑: 1.我查询的根等于换的根:无影响 2.我查询的根是换的根的 ...

  9. 【luogu P2169 正则表达式】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2169 tarjan缩点 + SPFA 缩完点之后加边注意别写错. 也可以不用建两个图,可以在一张图上判断是否 ...

随机推荐

  1. 【宝塔面板】centOS部署前后端分离所有遇到的坑,Django

    1:刚刚买完服务器,在宝塔面板安装完一切工具,Django顺利运行后(不能运行一般是起了中文名) # 问题:想迁移数据库,结果发现-bash: python3: command not found# ...

  2. Linux安装软件方法总结

    相比于windows系统,Linux安装程序就比较复杂了,很多需要root用户才能安装.常见的有以下几种安装方法 源码安装 rpm包安装 yum安装 (RedHat.CentOS) apt-get安装 ...

  3. 小白也能看懂的ArrayList的扩容机制

    来,话不多说进入正题!我们下面用最简单的代码创建ArrayList并添加11个元素,并 一 一 讲解底层源码:在说之前,给大家先普及一些小知识: >ArrayList底层是用数组来实现的 > ...

  4. matlab中set设置图形属性

    来源:https://ww2.mathworks.cn/help/matlab/ref/set.html?searchHighlight=set&s_tid=doc_srchtitle set ...

  5. 九、Python+Selenium模拟登录

    研究QQ登录规则的话,得分析大量Javascript的加密解密,比较耗时间.自己也是练习很少,短时间成功不了.所以走了个捷径. Selenium是一个WEB自动化测试工具,它运行时会直接实例化出一个浏 ...

  6. Hello World背后的事情

    Hello World是不少人学习C++的第一项内容,代码看似简单,很多东西却涉及根本 #include <iostream> using namespace std; int main( ...

  7. Win10下设置GOPATH系统变量,查看go env没有变化

    前言 最近在学习go语言,下载了golang安装包安装之后,使用go env查看环境变量,发现GOPATH已经指向默认的目录了 按照安装手册去系统变量设置了一下GOPATH,指向自定义目录 再来运行一 ...

  8. devops-持续集成管理之SonarQube

    1. devops-持续集成管理之SonarQube  1) 代码质量七宗罪 编码规范:是否遵守了编码规范,遵循了最佳实践. 潜在的BUG:可能在最坏情况下出现问题的代码,以及存在安全漏洞的代码. 文 ...

  9. ansible-playbook文件结构

    ansible-playbook文件结构: 1 --- 2 - name: play1 #指定的playbook名字 3 hosts: webservers #指定主机组 4 remote_user: ...

  10. day05 Pyhton学习

    1字典 字符串"" 列表[,] 元祖(,) 字典{:,} 集合{,} 2.增加 dic={} dic['name'] = '周润发' dic.setdefault() 如果dict ...