对于一个排列$p_{i}$,假设循环长度依次为$x_{1},x_{2},...,x_{m}$,那么所需步数即${\rm lcm}_{i=1}^{m}x_{i}$

由于是乘积,因此可以枚举素数$p$,并统计其的次数(注意这是对$\varphi(M)=M-1$取模)

类似于$E(X)=\sum_{i\ge 1}P(X\ge i)$,定义$f(k)$表示满足$\exists k\mid x_{i}$的排列数,次数即$\sum_{\alpha\ge 1}f(p^{\alpha})$

关于$f(k)$,考虑总排列数为$n!$,并去掉$\forall 1\le i\le m,k\not\mid x_{i}$的排列数即为所求

令$dp_{i}$表示$n=i$且要求$\forall 1\le j\le m,k\not\mid x_{j}$时的方案数,同样考虑总排列数为$i!$,并去掉$\exists k\mid x_{j}$的排列数即为所求,后者去枚举$\sum_{k\mid x_{j}}x_{j}$,显然剩下的部分即为$dp_{i-\sum_{k\mid x_{j}}x_{j}}$

由此,转移即
$$
dp_{i}=i!-\sum_{1\le j\le \lfloor\frac{i}{k}\rfloor}{i\choose jk}g_{j}dp_{i-jk}
$$
其中$g_{i}$表示$n=ik$且要求$\forall 1\le j\le m,k\mid x_{j}$时的方案数,枚举$n$​所在循环长度,转移即
$$
g_{i}=\sum_{1\le j\le i}{ik-1\choose jk-1}(jk-1)!g_{i-j}
$$
显然计算$g_{i}$的复杂度为$o(\frac{n^{2}}{k^{2}})$,同时由于只需要求$dp_{n}$,根据转移只关心于$i\equiv n(mod\ k)$的$dp_{i}$,因此求$dp_{i}$的复杂度同样为$o(\frac{n^{2}}{k^{2}})$,也即求$f(k)$的复杂度为$o(\frac{n^{2}}{k^{2}})$

而$k$显然$\in [1,n]$且不重复,因此复杂度为$o(\sum_{i=1}^{n}\frac{n^{2}}{i^{2}})$,提出$n^{2}$后该式收敛于$\frac{\pi^{2}}{6}$

综上,总复杂度即为$o(n^{2})$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 7505
4 #define ll long long
5 int n,mod,ans,p[N],vis[N],fac[N],C[N][N],g[N],f[N];
6 int qpow(int n,int m){
7 int s=n,ans=1;
8 while (m){
9 if (m&1)ans=(ll)ans*s%mod;
10 s=(ll)s*s%mod;
11 m>>=1;
12 }
13 return ans;
14 }
15 int calc(int k){
16 memset(g,0,sizeof(g));
17 memset(f,0,sizeof(f));
18 g[0]=f[0]=1;
19 for(int i=1;i<=n/k;i++)
20 for(int j=1;j<=i;j++)g[i]=(g[i]+(ll)C[i*k-1][j*k-1]*fac[j*k-1]%(mod-1)*g[i-j])%(mod-1);
21 for(int i=0;i<=n;i++)
22 if (i%k==n%k){
23 f[i]=fac[i];
24 for(int j=1;j<=i/k;j++)f[i]=(f[i]-(ll)C[i][j*k]*g[j]%(mod-1)*f[i-j*k]%(mod-1)+mod-1)%(mod-1);
25 }
26 return (fac[n]-f[n]+mod-1)%(mod-1);
27 }
28 int main(){
29 for(int i=2;i<N;i++){
30 if (!vis[i])p[++p[0]]=i;
31 for(int j=1;(j<=p[0])&&(i*p[j]<N);j++){
32 vis[i*p[j]]=1;
33 if (i%p[j]==0)break;
34 }
35 }
36 scanf("%d%d",&n,&mod);
37 fac[0]=1;
38 for(int i=1;i<N;i++)fac[i]=(ll)i*fac[i-1]%(mod-1);
39 for(int i=0;i<N;i++){
40 C[i][0]=C[i][i]=1;
41 for(int j=1;j<i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%(mod-1);
42 }
43 ans=1;
44 for(int i=1;i<=p[0];i++)
45 for(int j=p[i];j<=n;j*=p[i])ans=(ll)ans*qpow(p[i],calc(j))%mod;
46 printf("%d\n",ans);
47 return 0;
48 }

[loj3284]Exercise的更多相关文章

  1. MIT 6.828 JOS学习笔记12 Exercise 1.9

    Lab 1中Exercise 9的解答报告 Exercise 1.9: 判断一下操作系统内核是从哪条指令开始初始化它的堆栈空间的,以及这个堆栈坐落在内存的哪个地方?内核是如何给它的堆栈保留一块内存空间 ...

  2. MIT 6.828 JOS学习笔记13 Exercise 1.10

    Lab 1 Exercise 10 为了能够更好的了解在x86上的C程序调用过程的细节,我们首先找到在obj/kern/kern.asm中test_backtrace子程序的地址, 设置断点,并且探讨 ...

  3. MIT 6.828 JOS学习笔记11 Exercise 1.8

    Exercise 1.8       我们丢弃了一小部分代码---即当我们在printf中指定输出"%o"格式的字符串,即八进制格式的代码.尝试去完成这部分程序. 解答: 在这个练 ...

  4. MIT 6.828 JOS学习笔记8. Exercise 1.4

    Lab 1 Exercise 4 阅读关于C语言的指针部分的知识.最好的参考书自然是"The C Programming Language". 阅读5.1到5.5节.然后下载poi ...

  5. MIT 6.828 JOS学习笔记9. Exercise 1.5

    Lab 1 Exercise 5 再一次追踪一下boot loader的一开始的几句指令,找到第一条满足如下条件的指令处: 当我修改了boot loader的链接地址,这个指令就会出现错误. 找到这样 ...

  6. MIT 6.828 JOS学习笔记5. Exercise 1.3

    Lab 1 Exercise 3 设置一个断点在地址0x7c00处,这是boot sector被加载的位置.然后让程序继续运行直到这个断点.跟踪/boot/boot.S文件的每一条指令,同时使用boo ...

  7. MIT 6.828 JOS学习笔记3. Exercise 1.2

    这篇博文是对Lab 1中的Exercise 2的解答~ Lab 1 Exercise 2: 使用GDB的'si'命令,去追踪ROM BIOS几条指令,并且试图去猜测,它是在做什么.但是不需要把每个细节 ...

  8. Stanford coursera Andrew Ng 机器学习课程编程作业(Exercise 2)及总结

    Exercise 1:Linear Regression---实现一个线性回归 关于如何实现一个线性回归,请参考:http://www.cnblogs.com/hapjin/p/6079012.htm ...

  9. stanford coursera 机器学习编程作业 exercise 3(逻辑回归实现多分类问题)

    本作业使用逻辑回归(logistic regression)和神经网络(neural networks)识别手写的阿拉伯数字(0-9) 关于逻辑回归的一个编程练习,可参考:http://www.cnb ...

随机推荐

  1. mysql从零开始之MySQL DELETE 语句

    MySQL DELETE 语句 你可以使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录. 你可以在 mysql> 命令提示符或 PHP 脚本中执行该命令. 语法 ...

  2. 在 ASP.NET Core 中自动启用 CAP 事务

    本篇文章旨在描述如何在 ASP.NET Core项目中并以一种简便的方式启用CAP事务,因为在我们的示例中都是直接演示比较直观的方式,没有进行封装,有些初学者同学不太会,找到问我如何封装,本篇文章主要 ...

  3. 2.3 Core Building Blocks 核心构件

    Core Building Blocks 核心构件 DDD mostly focuses on the Domain & Application Layers and ignores the ...

  4. Less-32 宽字节

    <!-- 下午整了半天Less-29~31,愣是没调好jsp环境,只好跳过. 难受.jpg !--> Less-32: 核心语句: 各种回显均存在. 第一句话指定了字符集为gbk. che ...

  5. UltraSoft - Alpha - Scrum Meeting 2

    Date: Apr 09th, 2020. 会议内容为完成初步的任务分工. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM.后端 继续Django tuto ...

  6. [对对子队]会议记录4.20(Scrum Meeting11)

    今天已完成的工作 何瑞 ​ 工作内容:搭建第三关,添加了运行指令标识 ​ 相关issue:搭建关卡2.3 ​ 相关签入:4.20签入1 4.20签入2 吴昭邦 ​ 工作内容:搭建第三关 ​ 相关iss ...

  7. OO电梯作业总结

    (一)第五次作业 一.设计思路 生产消费者模型,输入接口是producer,调度器是tray,电梯是customer.由于只有一架电梯,所以生产消费模型满足以下条件: 一个生产者,一个消费者 托盘不为 ...

  8. Go语言核心36讲(Go语言进阶技术八)--学习笔记

    14 | 接口类型的合理运用 前导内容:正确使用接口的基础知识 在 Go 语言的语境中,当我们在谈论"接口"的时候,一定指的是接口类型.因为接口类型与其他数据类型不同,它是没法被实 ...

  9. [暴力题解&&考试反思] 双十一欢乐赛(联赛膜你测试32)

    前言: 今天考试很迷糊.从7点考到11点半,我大概从7点睡到9点.隐隐约约看到旁边的狗哥敲了好几个题,我才开始写代码.然后因为还是很困,而且T1迷迷糊糊调了好长时间,T3T4的暴力就懒的写了... 估 ...

  10. C/C++编程笔记:浪漫流星雨表白装b程序

    作为一个未来可能会成为一个专业程序员的小伙们,不知道你们现在学到哪里了,学了点东西之后有没有想在你女朋友面前装个大大的b呢,今天小编就给你一个机会来研究一下下边的代码吧,保证大写的N,当然大佬是排除在 ...