【Luogu】 P6274 [eJOI2017]六 题解
首先,题目说了最多\(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]六 题解的更多相关文章
- 【luogu P5022 旅行】 题解
题目连接:https://www.luogu.org/problemnew/show/P5022 \(NOIP2018 DAY2T1\) 考场上只写了60分,很容易想到当 m = n - 1 时的树的 ...
- 【luogu P2831 愤怒的小鸟】 题解
题目链接:https://www.luogu.org/problemnew/show/P2831 写点做题总结:dp,搜索,重在设计状态,状态设的好,转移起来也方便. 对于一条抛物线,三点确定.(0, ...
- 【luogu P2827 蚯蚓】 题解
题目链接:https://www.luogu.org/problemnew/show/P2827 35分:暴力sortO(mnlogn). 80分:考虑到每次不好维护不被切的点+q,正难则反.改成维护 ...
- 【luogu P3959 宝藏】 题解
题目链接:https://www.luogu.org/problemnew/show/P3959 我只是心血来潮想学SA(考场上骗分总行吧). 这个题可以状压DP.爆搜+剪枝.有意思的还是随机化搜索( ...
- 【luogu P3410 拍照】 题解
题目链接:https://www.luogu.org/problemnew/show/P3410 这个题就是求一个最大权闭合图 在一个图中,一些点构成一个集合,且集合中的出边指向的终点也在这个集合中, ...
- 【luogu P1113 杂务】 题解
题目链接:https://www.luogu.org/problemnew/show/P1113 菜 #include <queue> #include <cstdio> #i ...
- 【luogu P4114 Qtree1】 题解
题目链接:https://www.luogu.org/problemnew/show/P4114 1.把边权转化到点权:选取连接这条边的两个点中较深的一个. 2.查询点到点之间的边权时,要从seg[x ...
- 【luogu P3979 遥远的国度】 题解
题目链接:https://www.luogu.org/problemnew/show/P3979 除了换根操作都是裸的树剖 所以换根时考虑: 1.我查询的根等于换的根:无影响 2.我查询的根是换的根的 ...
- 【luogu P2169 正则表达式】 题解
题目链接:https://www.luogu.org/problemnew/show/P2169 tarjan缩点 + SPFA 缩完点之后加边注意别写错. 也可以不用建两个图,可以在一张图上判断是否 ...
随机推荐
- 软件定义网络实验记录④--Open vSwitch 实验——Mininet 中使用 OVS 命令
一.实验目的 Mininet 安装之后,会连带安装 Open vSwitch,可以直接通过 Python 脚本调用 Open vSwitch 命令,从而直接控制 Open vSwitch,通过实验了解 ...
- Windows10系统下wsappx占用CPU资源过高?wsappx是什么?如何关闭wsappx进程?
在Windows10系统开机的时候,wsappx进程占用的CPU资源非常高,导致电脑运行速度缓慢,那么我们如何关闭wsappx进程,让电脑加快运行速度呢?下面就一起来看一下操作的方法吧. [现象] 1 ...
- vue超出8个字符,显示省略号
显示的数据
- Cypress系列(63)- 使用 Custom Commands
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html Custom Commands 自定义命 ...
- 多测师讲解selenium_iframe框定位_高级讲师肖sir
iframe 框定位方法: 查看iframe框 京东点击登录定位元素 定位qq: qq登录定位的元素 查找iframe框 定位iframe框 from selenium import webdrive ...
- Verilog基础入门——简单的语句块编写(二)
[题干] [代码] module top_module( input a, input b, output out ); assign out = a&b; endmodule [与或非门等] ...
- 如何轻松使用 C 语言实现一个栈?
什么是数据结构? 数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是怎么把这些数 ...
- nginx安全:修改对外的服务软件名称并隐藏版本号(nginx1.18.0)
一,为什么要隐藏nginx真实的软件名称? 1,nginx响应的Server头部都会携带上服务软件的名字和版本信息, 服务器软件的版本信息暴光在外部,很容易被黑客了解到,就通过相应版本的漏洞来攻击服务 ...
- HTML语义化罗嗦罗嗦
CSS还未诞生之前,为了实现一些样式效果.设计师必须使用一些物理标签,例如font.b等.这样会造成页面中充满了为实现各种样式的标签,特别是使用table标签来实现一些特殊的布局,俗称为"标 ...
- 皕杰报表:连接数据库失败,请检查数据源配置(oracle.jdbc.driver.OracleDriver)
皕杰报表:连接数据库失败,请检查数据源配置(oracle.jdbc.driver.OracleDriver)问题解决: 缺少了classes12.jar 在窗口--首选项--报表运行时配置--添加-- ...