首先,题目说了最多\(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. python-代数式括号有效性检验

    思路: 利用栈实现代数式中括号有效行的的检验: 代码: class mychain(object): #利用链表建立栈,链表为父类 length=0 def __init__(self,value=N ...

  2. 一文搞懂AQS及其组件的核心原理

    @ 目录 前言 AbstractQueuedSynchronizer Lock ReentrantLock 加锁 非公平锁/公平锁 lock tryAcquire addWaiter acquireQ ...

  3. Java 文件 IO 操作

    window 路径分割符: \ 表示 windows 系统文件目录分割符 java 代码在 windows 下写某个文件的话需要下面的方式 D:\\soft\\sdclass.txt  其中一个单斜杠 ...

  4. c#之task与thread区别及其使用

    如果需要查看更多文章,请微信搜索公众号 csharp编程大全,需要进C#交流群群请加微信z438679770,备注进群, 我邀请你进群! ! ! --------------------------- ...

  5. 对NETIF_F_GSO的一些理解

    看linux内核协议栈的时候看到tcp_sendmsg函数,看起来并不难理解,但是申请skb的时候主buff大小让我很困惑.我以前一直以为会根据sack/ip option/pmtu等计算一个mss, ...

  6. Kubernetes K8S之存储ConfigMap详解

    K8S之存储ConfigMap概述与说明,并详解常用ConfigMap示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS ...

  7. day49 Pyhton 数据库Mysql 06

    多表查询 连表查询 要进行连接,那一定涉及两个表,两个表中要有关联条件才能进行连接 内连接 只有表一和表二中的连接条件都满足的时候才能显示出来 inner join on /where 条件 sele ...

  8. 为Linux的文件管理器创建“在此打开终端”菜单

    有些Linux的GUI文件管理器没有右键菜单"在此打开终端",或者有却不能自行指定某种终端. 因为文件夹也有其MIME类型(inode/directory),通过文件关联的方式,把 ...

  9. widows安装ffmpeg

    首先下载ffmpeg的windows版本https://ffmpeg.zeranoe.com/builds/ 解压到d盘 win+r cmd 说明成功了

  10. css中伪元素before或after中content的特殊用法attr【转】

    [原文]https://segmentfault.com/a/1190000002750033 CSS中主要的伪元素有四个:before/after/first-letter/first-line,在 ...