首页 > 其他分享 >Alien 的排列题解

Alien 的排列题解

时间:2023-06-15 19:58:07浏览次数:31  
标签:排列 题解 LL 交换 Alien leq mathcal sim

Description

求出有多少 \(2\sim n+1\) 的排列 \(\{P_{n}\}\),使得对于所有 \(1\leq i\leq n\) 有 \(i|P_{i}\)。

对于 \(30\%\) 的数据 \(n\leq 10\)。

对于 \(90\%\) 的数据 \(n\leq 3000\)。

对于 \(100\%\) 的数据 \(n\leq 10^9\)。

Solution

如果把 \(n+1\) 固定在第 \(1\) 个位置的话,只有一种排列,证明显然。

考虑将 \(n+1\) 与其他数交换。设把它与 \(k\) 交换,那么需要满足 \(k|n\land k\neq n\)。我们发现,交换后 \(k\) 跑到第一个位置了,而 \(k\) 显然不可能与 \(\geq k\) 的数交换,那么问题就转换成了一个 \(2\sim k\) 的排列的问题了。

设 \(f_{n}\) 为 \(2\sim n\) 的合法排列方案数,则由上文得 \(f_{n}=\sum\limits_{d|n\land d\neq n}f_{d}\),边界是 \(f_{1}=1\)。

使用朴素 dp 可以做到 \(\mathcal{O}(n^2)\) 或 \(\mathcal{O}(n\sqrt{n})\)。可以使用记忆化搜索,由于搜索树像杜教筛,所以时间复杂度应该是 \(\mathcal{O}(n^{\frac{3}{4}})\)。

Code

#include <bits/stdc++.h>
using namespace std;
namespace Milkcat {
	typedef long long LL;
	const int N = 1e6 + 5;
	LL n;
	unordered_map<LL, LL> f;
	LL dfs(LL n) {
		if (f[n]) return f[n];
		for (int i = 1; i * i <= n; i ++) {
			if (n % i) continue;
			f[n] += dfs(i);
			if (i * i != n && i != 1) f[n] += dfs(n / i);
		}
		return f[n];
	}
	int main() {
		cin >> n, n ++, f[1] = 1;
		cout << dfs(n) << '\n';
		return 0;
	}
}
int main() {
    int T = 1;
    while (T --) Milkcat::main();
    return 0;
}

标签:排列,题解,LL,交换,Alien,leq,mathcal,sim
From: https://www.cnblogs.com/Milkcatqwq/p/17483953.html

相关文章

  • 问题解决sql文件上传和蚁剑连接
    1.无法连接上自己的ip:发现问题是上传的木马不在127.0.0.1的文件下时,会导致解析不到木马,要将木马上传到127.0.0.1的文件下连接2.解决sql上传一句话木马问题要先在mysql的配置文件my.ini中添加导入导出数据库的地址:secure_file_priv=D:\phpstudy_pro\WWW然后重启数据库,可以进行sq......
  • [ZJOI2022] 深搜 题解
    题目描述九条可怜是一个喜欢算法的女孩子,在众多算法中她尤其喜欢深度优先搜索(DFS)。有一天,可怜得到了一棵有根树,树根为\(\mathit{root}\),树上每个节点\(x\)有一个权值\(a_x\)。在一棵树上从\(x\)出发,寻找\(y\)节点,如果使用深度优先搜索,则可描述为以下演算过程:将递归栈......
  • 关于display:flex;justify-content: space-between;的最后一个元素无法左对齐的问题解
    1.问题:当使用v-for遍历一个数组,当数字长度不是要进行左右对齐的数字的倍数*(以3为例),无法进行左对齐的问题 解决方法:1.使用watch监听这个数组的长度的变化,判断这个数组的长度是否3%2是不是等于0,如果是为则这个数字追加一个空对象,代码如下:watch:{rowsForm:{......
  • [问题解决]:ImportError: /home/test/anaconda3/envs/py39/bin/../lib/libstdc++.so.6
    报错(py39)test@test:~/code/Face/test_speed$pythonface_yaw_pitc_roll.pyTraceback(mostrecentcalllast):File"/home/test/code/Face/test_speed/face_yaw_pitc_roll.py",line17,in<module>importdlibFile"/home/test/anacon......
  • P2801 教主的魔法 题解
    一、题目描述:给你一个长度为$n$的序列$a$,你需要进行$m$次操作。$类型\1\:将区间\l\到\r\的数加\x\。$$类型\2\:求区间\l\到\r\中有多少个数大于等于\x\。$数据范围:$1\len\le1\times10^6,m\le3\times10^3$ 二、解题思路:......
  • 带重复元素的排列
    带重复元素的排列题目:描述给出一个具有重复数字的列表,找出列表所有不同的排列。样例样例1:输入:nums=[1,1]输出:[[1,1]]解释:[1,1]的不同排列只有[1,1]。样例2:输入:nums=[1,2,2]输出:[[1,2,2],[2,1,2],[2,2,1]]解题思路:首先思考如何去重,先......
  • JAVA面试题解惑系列(八)——聊聊基本类型(内置类型)
    关键字:java面试题基本类型intlongbooleanfloatdoublechar作者:臧圩人(zangweiren)基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型。它们是我们编程中使用最频繁的类型,因此面试题中也总少不了它们的身影,在这篇文章中我们将从面试中常考的几个方面来回顾一......
  • JAVA面试题解惑系列(四)——final、finally和finalize的区别
    关键字:java面试题finalfinallyfinalize作者:臧圩人(zangweiren)final、finally和finalize的区别是什么?这是一道再经典不过的面试题了,我们在各个公司的面试题中几乎都能看到它的身影。final、finally和finalize虽然长得像孪生三兄弟一样,但是它们的含义和用法却是......
  • AtCoder Beginner Contest 305 题解 A - F
    A-WaterStation题目大意找到离给定的数最近的一个\(5\)的倍数输出即可。解题思路我们取这个数对\(5\)的上下界,也就是整数除以\(5\)再乘以\(5\),以及这个数再加上一个\(5\),比较这两数和给定数的距离即可。ACCode#include<iostream>#include<algorithm>#includ......
  • 题解 ABC207F【Tree Patrolling】
    挺简单的树上背包,就是有点难写。设\({dp}_{u,i,x,y}\)表示仅考虑\(u\)的子树内,有\(i\)个节点被控制,\(x\)为节点\(u\)是否有警卫,\(y\)为节点\(u\)是否被控制。(其实所有\(x=1,y=0\)的状态都没用,但我懒得管了。)每个点\(u\)的初始值为\({dp}_{u,0,0,0}={dp}_{u,1,1......