题目传送门

题目大意

给出一个数 \(n\),你要构造一个数列,满足里面每个数都是 \(n\) 的因子,且每一个数与前面不互质的个数不超过 \(1\)。问有多少种合法方案。

保证 \(n\) 的不同质因子个数 \(\le 6\)。

思路

这个题不是很难,只是比较难写。不过 \(\Theta(6\times 3^6)\) 的做法感觉比较有意思,但是我写的是玄学时间复杂度的做法。

我们可以看出数列长度最大也就 \(12\),而且质因子个数也很少,不难想到状压 dp,我们发现这个状压 dp 完全没有什么难点,直接 \(f_{S,x}\) 表示当前状态为 \(S\),已经填了 \(x\) 位的方案数。对于一个状态,肯定是每个质因子的状态组合起来,你发现重要的不过就是这个质因子出现了几次,如果只出现一次是哪些质因子一起出现的。你把这个压进状态就好了。

似乎预处理了之后转移可以更快,但是懒得了。

\(\texttt{Code}\)

#include <bits/stdc++.h>
using namespace std; #define Int register int
#define mod 1000000007
#define ll long long template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');} ll N;
int cnt,yz[15],pw[15]; int mul (int a,int b){return 1ll * a * b % mod;}
int dec (int a,int b){return a >= b ? a - b : a + mod - b;}
int add (int a,int b){return a + b >= mod ? a + b - mod : a + b;}
void Mul (int &a,int b){a = mul (a,b);}
void Dec (int &a,int b){a = dec (a,b);}
void Add (int &a,int b){a = add (a,b);} void Makeyz (ll n){
for (Int i = 2;1ll * i * i <= n;++ i){
if (n % i == 0){
yz[++ cnt] = i;
while (n % i == 0) n /= i,pw[cnt] ++;
}
}
if (n > 1) yz[++ cnt] = n,pw[cnt] = 1;
} int f[1 << 19][15]; signed main(){
read (N),Makeyz (N);
f[0][0] = 1;int ans = 0;
for (Int x = 0;x < cnt * 2;++ x){
for (Int nowS = 0;nowS < (1 << cnt * 3);++ nowS){
if (!f[nowS][x]) continue;
vector <int> unused,cho;
bool used[12] = {};
for (Int i = 1;i <= cnt;++ i){
int k = nowS >> (i - 1) * 3 & 7;
if (!k) unused.push_back (i);
else if (k < 7 && !used[k]) cho.push_back (i),used[k] = 1;
}
int siz1 = unused.size(),siz2 = cho.size();
for (Int S = 0;S < (1 << siz1);++ S){
int kase = 1,S1 = 0,fir = 0;
for (Int i = 0;i < siz1;++ i) if (S >> i & 1)
fir = fir ? fir : unused[i],Mul (kase,pw[unused[i]]),S1 |= (1 << (unused[i] - 1) * 3) * fir;
if (S) Add (f[nowS | S1][x + 1],mul (kase,f[nowS][x]));
if (!cho.size()) continue;
for (Int u : cho){
int k = nowS >> (u - 1) * 3 & 7,siz2 = 0;
vector <int> uni;
for (Int i = 1;i <= cnt;++ i) if ((nowS >> (i - 1) * 3 & 7) == k) uni.push_back (i);
siz2 = uni.size();
for (Int choS = 1;choS < (1 << siz2);++ choS){
int newS = nowS | S1,fir = 0x7f7f7f7f,kase1 = 1;
for (Int i = 0;i < siz2;++ i)
if (choS >> i & 1) newS -= (1 << (uni[i] - 1) * 3) * (k - 7),Mul (kase1,pw[uni[i]]);
else fir = min (fir,uni[i]);
for (Int i = 0;i < siz2;++ i) if (!(choS >> i & 1)) newS -= (1 << (uni[i] - 1) * 3) * (k - fir);
Add (f[newS][x + 1],mul (f[nowS][x],mul (kase,kase1)));
}
}
}
}
}
for (Int x = 1;x <= cnt * 2;++ x) for (Int nowS = 0;nowS < (1 << cnt * 3);++ nowS) Add (ans,f[nowS][x]);
write (ans),putchar ('\n');
return 0;
}

题解 2020.10.24 考试 T3 数列的更多相关文章

  1. 题解 2020.10.24 考试 T2 选数

    题目传送门 题目大意 见题面. 思路 本来以为zcx.pxj变强了,后来发现是SPJ出问题了...考试的时候感觉有点人均啊...结果自己还是只想出来一半. 我们假设 \(f(x)=(\lfloor\f ...

  2. 题解 2020.10.24 考试 T4 模板

    题目传送门 题目大意 有一个 \(n\) 个点组成的树,有 \(m\) 次操作,每次将 \(1\to x\) 的路径上每个点都加入一个颜色为 \(c\) 的小球.但是每个点都有大小限制,即小球个数超过 ...

  3. 10.24考试题解qwq

    考点难度都很合适的一套题目,大概在day1到day2之前 T1 猴猴最喜欢在树上玩耍,一天猴猴又跳上了一棵树,这棵树有N个苹果,每个苹果有一个编号,分别为0~N-1,它们之间由N-1个树枝相连,猴猴可 ...

  4. 题解【2.23考试T3】val

    3. val[题目描述] 这是一道传统题,源代码的文件名为 val.cpp/c/pas. 有一个值初始为 0,接下来 n 次你可以令其在之前基础上+2 或+1 或-1.你需要保证,这个值在整个过程中达 ...

  5. 2020.10.24【普及组】模拟赛C组 总结

    T1:暴力 1:先从 6 个中选三个,再把选出的三个全排列,全排列后再判断是否可行 2:把 6 个全都全排列,然后判断 T2:判断误差 1:减法时结果加上 1e-8 2:把小数乘上 1e6 左右 考试 ...

  6. 2016 10 28考试 dp 乱搞 树状数组

    2016 10 28 考试 时间 7:50 AM to 11:15 AM 下载链接: 试题 考试包 这次考试对自己的表现非常不满意!! T1看出来是dp题目,但是在考试过程中并没有推出转移方程,考虑了 ...

  7. JZOJ 2020.10.6 提高B组反思

    JZOJ 2020.10.6 提高B组反思 T1 NYG的动态数点 最简单的一题 很容易想到\(O(n)\)的做法 枚举最小的那个数,即\(a_k\) 然后向左和向右扩展 然后可以直接从右端点+1继续 ...

  8. 10.24 正睿停课训练 Day8 AM

    目录 2018.10.24 正睿停课训练 Day8 AM A 棒棒糖(组合) B 彩虹糖(思路 博弈) C 泡泡糖(DP) 考试代码 A B C 2018.10.24 正睿停课训练 Day8 AM 期 ...

  9. 2020.10.17 JZOJ 提高B组T2 导弹拦截

    2020.10.17 JZOJ 提高B组T2 导弹拦截 题目 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统. 敌国的导弹形成了立体打击,每个导弹可以抽象成一个三维空间中的 ...

随机推荐

  1. 【Google Cloud技术咨询】「Contact Center AI」引领我们走向高度智能客服的时代

    前提背景 我们距离"不再智障"的智能客服还有多远?对于智能客服,用户一直都是"批评多于褒奖",究其原因是在于人们对于AI客服的期待很高,而AI客服在实际应用中的 ...

  2. 六、Abp vNext 基础篇丨文章聚合功能上

    介绍 9月开篇讲,前面几章群里已经有几个小伙伴跟着做了一遍了,遇到的问题和疑惑也都在群里反馈和解决好了,9月咱们保持保持更新.争取10月份更新完基础篇. 另外番外篇属于 我在abp群里和日常开发的问题 ...

  3. python json demo

    值得注意的一点是,list类型的数据可以用[2,3]的方式定义,如"b" import json jsonData = '{"a":1,"b" ...

  4. 谷歌api 二维码生成 实例

    谷歌提供的二维码生成器接口,非常实用!分享给大家 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  5. TCP连接中的状态

    1. 正常状态转换 我们用图 3-13 来显示在正常的 TCP 连接的建立与终止过程中,客户与服务器所经历的不同状态.读者可以对照图 3-12 来阅读,使用图 3-12 的状态图来跟踪图 3-13 的 ...

  6. QT学习日记篇-03-仿写一个智能家居界面

    课程大纲: <1>让界面漂亮起来,仿写一个智能家居界面 ->第一:给QT工程添加图片 进入下一步: <注意路径和名称一定不能有中文>                   ...

  7. VS Code闪现,巨头纷纷入局的Web IDE缘何崛起?

    我发了,我装的. 就在前几天,微软简短的发布了Visual Studio Code for the Web 的公告,而没过一阵,这则公告就被删除了,现在点经相关内容已经是404状态了.虽然公告的内容已 ...

  8. awk 命令-随笔

    awk语法: awk [option] 'pattern{action}' file ... awk [参数] '条件{动作}' 文件 ... 解析: 命令: awk 参数: -F "&qu ...

  9. 羽夏笔记——PE结构(不包含.Net)

    写在前面   本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...

  10. Geode member发现机制

    Geode member发现机制 Apache Geode 为集群和客户端服务器间提供了多种member 发现机制,具体如下: Peer Member Discovery Standalone Mem ...