Description(P4161)

windy学会了一种游戏。

对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应。

最开始windy把数字按顺序1,2,3,……,N写一排在纸上。

然后再在这一排下面写上它们对应的数字。

然后又在新的一排下面写上它们对应的数字。

如此反复,直到序列再次变为1,2,3,……,N。

如: 1 2 3 4 5 6

对应的关系为

1->2 2->3 3->1 4->5 5->4 6->6

windy的操作如下

1 2 3 4 5 6

2 3 1 5 4 6

3 1 2 4 5 6

1 2 3 5 4 6

2 3 1 4 5 6

3 1 2 5 4 6

1 2 3 4 5 6

这时,我们就有若干排1到N的排列,上例中有7排。

现在windy想知道,对于所有可能的对应关系,有多少种可能的排数。

Description(P6280)

Farmer John(又)想到了一个新的奶牛晨练方案!
如同之前,Farmer John 的 $N$ 头奶牛站成一排。对于$1\leq i \leq N$的每一个 $i$,从左往右第 $i$ 头奶牛的编号为 $i$。他告诉她们重复以下步骤,直到奶牛们与她们开始时的顺序相同。

给定长为 $N$ 的一个排列 $A$,奶牛们改变她们的顺序,使得在改变之前从左往右第 $i$ 头奶牛在改变之后为从左往右第 $A_i​$ 头。
例如,如果 $A=(1,2,3,4,5)$,那么奶牛们总共进行一步。如果 $A=(2,3,1,5,4)$,那么奶牛们总共进行六步。每步之后奶牛们从左往右的顺序如下:

0 步:$(1,2,3,4,5)$
1 步:$(3,1,2,5,4)$
2 步:$(2,3,1,4,5)$
3 步:$(1,2,3,5,4)$
4 步:$(3,1,2,4,5)$
5 步:$(2,3,1,5,4)$
6 步:$(1,2,3,4,5)$
求所有正整数 $K$ 的和,使得存在一个长为 $N$ 的排列,奶牛们需要进行恰好 $K$ 步。

由于这个数字可能非常大,输出答案模 $M$ 的余数($10^8 \leq M \leq 10^9+7$,$M$ 是质数)。

Solution

两个问题,一个解法

两题的题目表述都表明题中给出的数的对应关系形成了一张图,这张图由多个环组成,可能有自环,环长之和为$N$

最终的答案分别是每个环长的$lcm$个数/和

对于一列数的$lcm$,等于这列数质因数分解后每个质数对应的最高次之积

所以现在要求将$N$分解,为了使分解后的数能组成更多种$lcm$,最优的选择应是让这列数互质

因为有可能分解出$1$,所以对于分解出$1$的个数不同,依次拆分$[1,N]$中所有数,输出它们的答案之和

考虑枚举质数

设$f_{i,j}$表示在前$i$个质数中,拆分数$j$所能得到的$lcm$个数/和

对于P4161:

$$f_{i,j}=\sum_{k=0}^{j\geq p_{i}^k} dp_{i-1,j-p_{i}^k}$$

对于P6280:

$$f_{i,j}=\sum_{k=0}^{j\geq p_{i}^k} dp_{i-1,j-p_{i}^k}\times p_{i}^k$$

#include<iostream>
#include<cstdio>
using namespace std;
int n,tot,prime[];
long long dp[],ans;
bool vst[];
inline int read()
{
int w=,f=;
char ch=;
while(ch<''||ch>'')
{
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
w=(w<<)+(w<<)+ch-'';
ch=getchar();
}
return w*f;
}
int main()
{
n=read();
for(int i=;i<=n;i++)
{
if(!vst[i])
{
prime[++tot]=i;
}
for(int j=;j<=tot&&prime[j]*i<=n;j++)
{
vst[prime[j]*i]=true;
if(!(i%prime[j]))
{
break;
}
}
}
dp[]=;
for(int i=;i<=tot;i++)
{
for(int j=n;j>=prime[i];j--)
{
int temp=prime[i];
while(j>=temp)
{
dp[j]+=dp[j-temp];
temp*=prime[i];
}
}
}
for(int i=;i<=n;i++)
{
ans+=dp[i];
}
printf("%lld\n",ans+);
return ;
}

游戏

#include<iostream>
#include<cstdio>
using namespace std;
long long n,tot,prime[],mod;
long long dp[],ans;
bool vst[];
inline long long read()
{
long long w=,f=;
char ch=;
while(ch<''||ch>'')
{
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
w=(w<<)+(w<<)+ch-'';
ch=getchar();
}
return w*f;
}
int main()
{
n=read();
mod=read();
for(long long i=;i<=n;i++)
{
if(!vst[i])
{
prime[++tot]=i;
}
for(long long j=;j<=tot&&prime[j]*i<=n;j++)
{
vst[prime[j]*i]=true;
if(!(i%prime[j]))
{
break;
}
}
}
dp[]=;
for(long long i=;i<=tot;i++)
{
for(long long j=n;j>=prime[i];j--)
{
long long temp=prime[i];
while(j>=temp)
{
(dp[j]+=dp[j-temp]*temp)%=mod;
temp*=prime[i];
}
}
}
for(long long i=;i<=n;i++)
{
(ans+=dp[i])%mod;
}
printf("%lld\n",(ans+)%mod);
return ;
}

Exercise G

LG P4161 [SCOI2009]游戏/LG P6280 [USACO20OPEN]Exercise G的更多相关文章

  1. Luogu P6280 [USACO20OPEN]Exercise G

    题意 定义一个长度为 \(n\) 的置换的步数为将 \(P=(1,2,\cdots,n)\) 在该置换操作下变回原样的最小次数. 求所有 \(K\) 的和,使得存在一个长度为 \(n\) 的置换使得其 ...

  2. luogu P4161 [SCOI2009]游戏

    传送门 我们发现整个大置换中,会由若干形如\((a_1\rightarrow a_2,a_2\rightarrow a_3,...a_{n-1}\rightarrow a_n,a_n\rightarr ...

  3. Luogu P4161 [SCOI2009]游戏 数论+DP

    ywy神犇太巨辣!!一下就明白了!! 题意:求$lcm(a_1,a_2,...,a_k)$的种类,其中$\Sigma\space a_i <=n$,$a_i$相当于环长 此处的$DP$,相当于是 ...

  4. P4161 [SCOI2009]游戏

    传送门 首先这题的本质就是把\(n\)分成若干个数的和,求他们的\(lcm\)有多少种情况 然后据说有这么个结论:若\(p_1^{c_1}+p_2^{c_2}+...+p_m^{c_m}\leq n\ ...

  5. SCOI2009游戏

    1025: [SCOI2009]游戏 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1065  Solved: 673[Submit][Status] ...

  6. BZOJ 1025 [SCOI2009]游戏

    1025: [SCOI2009]游戏 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1533  Solved: 964[Submit][Status][ ...

  7. BZOJ 1025: [SCOI2009]游戏( 背包dp )

    显然题目要求长度为n的置换中各个循环长度的lcm有多少种情况. 判断一个数m是否是满足题意的lcm. m = ∏ piai, 当∑piai ≤ n时是满足题意的. 最简单我们令循环长度分别为piai, ...

  8. 【BZOJ1025】[SCOI2009]游戏(动态规划)

    [BZOJ1025][SCOI2009]游戏(动态规划) 题面 BZOJ 洛谷 题解 显然就是一个个的置换,那么所谓的行数就是所有循环的大小的\(lcm+1\). 问题等价于把\(n\)拆分成若干个数 ...

  9. bzoj千题计划116:bzoj1025: [SCOI2009]游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1025 题目转化: 将n分为任意段,设每段的长度分别为x1,x2,…… 求lcm(xi)的个数 有一个 ...

随机推荐

  1. LQB20180航班时间(sscanf)

    首先找找规律,两者相加除以二. 按格式读入sscanf 按格式输出printf("02d%",m);前导0 #include <iostream> #include & ...

  2. PHP preg_match_all() 函数

    preg_match_all 函数用于执行一个全局正则表达式匹配.高佣联盟 www.cgewang.com 语法 int preg_match_all ( string $pattern , stri ...

  3. Skill 脚本演示 ycSetNetColor.il

    https://www.cnblogs.com/yeungchie/ ycSetNetColor.il 将原理图中某一 netName 的所有连线同时修改为一种 颜色 / 线宽. 回到目录

  4. C/C++编程笔记:一张思维导图,带你总结C语言全部知识点!

    很多小伙伴想要好好地学习一下C语言的知识,但是又不知道怎么学,应该学哪一些C语言的知识,笔者在网上看到了这一张C语言的比较完善的C语言的学习路线图,有兴趣的小伙伴可以保存起来哈! C语言是面向过程的, ...

  5. 学习java 线程池-1: ThreadPoolExecutor

    1. Executor 该接口内只有一个接口方法 :该方法的目的就是执行指定的 Runnable (但会不会执行,或者会不会立马执行,则不一定.因为要取决于整个线程池的状态) Executor 中文的 ...

  6. ArrayList源码解析,老哥,来一起复习一哈?

    前言 JDK源码解析系列文章,都是基于JDK8分析的,虽然JDK14已经出来,但是JDK8我还不会,我... 类图 实现了RandomAccess接口,可以随机访问 实现了Cloneable接口,可以 ...

  7. 实验07——java输出数字的因数

    package cn.tedu.demo; import java.util.Scanner; /** * @author 赵瑞鑫 E-mail:1922250303@qq.com * @versio ...

  8. Springboot2.x整合logback slf4j

    Springboot项目的pom里引入的parent <parent> <groupId>org.springframework.boot</groupId> &l ...

  9. JS 窗口加载与定时器笔记

    bom浏览器对象模型     bom由一系列相关的对象构成并且每个对象都提供了很多方法属性     bom顶级对象是window     bom是浏览器产商在各自浏览器上定义的,兼容性差     wi ...

  10. DIFF算法浅析(三)在react中的实现

    在虚拟dom中diff的实现. 分别从4个方面: DIFF抽象概念(概述.时间复杂性分析) 在Vue2中的实现(版本2.6.11.必要性.执行方式) 在React中的实现(版本16.13.1,必要性. ...