题意

定义一个长度为 \(n\) 的置换的步数为将 \(P=(1,2,\cdots,n)\) 在该置换操作下变回原样的最小次数。

求所有 \(K\) 的和,使得存在一个长度为 \(n\) 的置换使得其步数为 \(K\),对 \(m\) 取模。

\(\texttt{Data Range:}1\leq n\leq 10^4,10^8\leq m\leq 10^9+7\)

题解

DP 练习题。

注意到一个置换的步数就是它的循环表示中所有循环长度的 \(\operatorname{lcm}\)。于是可以考虑对最大的质数因子来 DP。

设 \(f_{i,j}\) 表示当前所有循环中长度不为 \(1\) 的总长度之和为 \(i\),每个循环长度中最大的质因子不超过 \(p_j\) 的答案。

考虑枚举一下 \(p_j\) 的次幂作为新的循环的长度(加到原来的循环由于之后算答案会去重所以是一样的),于是得到一个转移方程:

\[f_{i,j}=f_{i,j-1}+\sum\limits_{p_j^k\leq i}p_j^kf_{i-p_j^k,j-1}
\]

然后可以 \(O(n^2)\) 转移。

注意到这个 \(j\) 只由 \(j-1\) 转移而来,所以可以滚动掉 \(j\) 的一维,同时 \(i\) 要倒序枚举。

代码

#include<bits/stdc++.h>
using namespace std;
typedef int ll;
typedef long long int li;
const ll MAXN=1e4+51;
ll n,ptot,MOD,res=1;
ll f[MAXN],prime[MAXN],np[MAXN];
inline ll read()
{
register ll num=0,neg=1;
register char ch=getchar();
while(!isdigit(ch)&&ch!='-')
{
ch=getchar();
}
if(ch=='-')
{
neg=-1;
ch=getchar();
}
while(isdigit(ch))
{
num=(num<<3)+(num<<1)+(ch-'0');
ch=getchar();
}
return num*neg;
}
int main()
{
n=read(),MOD=read(),f[0]=1;
for(register int i=2;i<=n;i++)
{
if(!np[i])
{
prime[++ptot]=i;
}
for(register int j=1;i*prime[j]<=n;j++)
{
np[i*prime[j]]=1;
if(!(i%prime[j]))
{
break;
}
}
}
for(register int i=1;i<=ptot;i++)
{
for(register int j=n;j>=1;j--)
{
for(register int k=prime[i];k<=j;k*=prime[i])
{
f[j]=(f[j]+(li)k*f[j-k]%MOD)%MOD;
}
}
}
for(register int i=1;i<=n;i++)
{
res=(res+f[i])%MOD;
}
printf("%d\n",res);
}

Luogu P6280 [USACO20OPEN]Exercise G的更多相关文章

  1. LG P4161 [SCOI2009]游戏/LG P6280 [USACO20OPEN]Exercise G

    Description(P4161) windy学会了一种游戏. 对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应. 最开始windy把数字按顺序1,2,3,……,N写一排在纸上. 然后再在 ...

  2. 洛谷 P6276 - [USACO20OPEN]Exercise P(组合数学+DP)

    洛谷题面传送门 废了,又不会做/ll orz czx 写的什么神仙题解,根本看不懂(%%%%%%%%% 首先显然一个排列的贡献为其所有置换环的乘积.考虑如何算之. 碰到很多数的 LCM 之积只有两种可 ...

  3. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  4. POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)

    手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn.net/suncongbo/article/details/79382991 题目链接: (p ...

  5. luogu P5366 [SNOI2017]遗失的答案

    luogu 首先gcd为\(G\),lcm为\(L\),有可能出现的数(指同时是\(G\)的因数以及是\(L\)的倍数)可以发现只有几百个.如果选出的数要能取到gcd,那么对于每种质因子,都要有一个数 ...

  6. 『题解』洛谷P4016 负载平衡问题

    title: categories: tags: - mathjax: true --- Problem Portal Portal1:Luogu Portal2: LibreOJ Descripti ...

  7. Storyboards Tutorial 03

    这一节主要介绍segues,static table view cells 和 Add Player screen 以及 a game picker screen. Introducing Segue ...

  8. 文件图标SVG

    ​<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink ...

  9. 线段树||BZOJ5194: [Usaco2018 Feb]Snow Boots||Luogu P4269 [USACO18FEB]Snow Boots G

    题面:P4269 [USACO18FEB]Snow Boots G 题解: 把所有砖和靴子排序,然后依次处理每一双靴子,把深度小于等于它的砖块都扔线段树里,问题就转化成了求线段树已有的砖块中最大的砖块 ...

随机推荐

  1. Processing 状态量控制动画技巧

    之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/62848357

  2. mysql-12-DDL

    #DDL /* 数据定义语言 库和表的管理 一.库的管理 创建.修改.删除 二.表的管理 创建.修改.删除 创建 create 修改 alter 删除 drop */ #一.库的管理 #1.库的创建 ...

  3. 安卓app功能或自动化测试覆盖率统计(不用instrumentation启动app)

    一文带你揭秘如何采取非instrumentation启动app,打造实时统计覆盖率,一键触发覆盖率测试报告. 在上篇文章,一文带你解决Android app手工测试或者自动化测试覆盖率统计(撸代码版) ...

  4. pytest之将多个测试用例放在一个类中,生成唯一临时文件夹

    将多个测试用例放在一个类中 简单来说就是将多个测试用例放到类中,通过pytest去管理,这和Testng很像.示例代码如下: """ 将多个测试用例放到一个类中执行 &q ...

  5. 批处理中的删除命令:del

    转载:https://blog.csdn.net/playboy1/article/details/6869358 删除一个或数个文件.DEL [/P] [/F] [/S] [/Q] [/A[[:]a ...

  6. 电机AB相编码器测速

    控制任务 检测编码器的脉冲并测速 电路设计 图1 直流电机带减速器和编码器 图2  编码器接线定义 编码器接线定义如下 M1:电机电源接口,绿色的 GND:编码器电源负极输入口,橙色的 C1:编码器A ...

  7. CF149D Coloring Brackets

    CF149D Coloring Brackets Link 题面: 给出一个配对的括号序列(如"\((())()\)"."\(()\)"等, "\() ...

  8. JavaScript innerTHML和createElement效率对比

    前言: 在DOM节点操作中,innerTHML和createElement都可以实现创建元素.它们实现的功能类似,但是效率却相差很大.本文分别统计用innerTHML字符串拼接方式.innerTHML ...

  9. 如何在yii2直接执行SQL

    执行SQL $connection=Yii::app()->db;   // 假设你已经建立了一个 "db" 连接 $sql = "SELECT * FROM tb ...

  10. 【转载】动态规划—各种 DP 优化

    原博客地址 关于氵博客:其实主要是防止我找不到这篇文了