LG P4161 [SCOI2009]游戏/LG P6280 [USACO20OPEN]Exercise G
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的更多相关文章
- Luogu P6280 [USACO20OPEN]Exercise G
题意 定义一个长度为 \(n\) 的置换的步数为将 \(P=(1,2,\cdots,n)\) 在该置换操作下变回原样的最小次数. 求所有 \(K\) 的和,使得存在一个长度为 \(n\) 的置换使得其 ...
- luogu P4161 [SCOI2009]游戏
传送门 我们发现整个大置换中,会由若干形如\((a_1\rightarrow a_2,a_2\rightarrow a_3,...a_{n-1}\rightarrow a_n,a_n\rightarr ...
- Luogu P4161 [SCOI2009]游戏 数论+DP
ywy神犇太巨辣!!一下就明白了!! 题意:求$lcm(a_1,a_2,...,a_k)$的种类,其中$\Sigma\space a_i <=n$,$a_i$相当于环长 此处的$DP$,相当于是 ...
- P4161 [SCOI2009]游戏
传送门 首先这题的本质就是把\(n\)分成若干个数的和,求他们的\(lcm\)有多少种情况 然后据说有这么个结论:若\(p_1^{c_1}+p_2^{c_2}+...+p_m^{c_m}\leq n\ ...
- SCOI2009游戏
1025: [SCOI2009]游戏 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1065 Solved: 673[Submit][Status] ...
- BZOJ 1025 [SCOI2009]游戏
1025: [SCOI2009]游戏 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1533 Solved: 964[Submit][Status][ ...
- BZOJ 1025: [SCOI2009]游戏( 背包dp )
显然题目要求长度为n的置换中各个循环长度的lcm有多少种情况. 判断一个数m是否是满足题意的lcm. m = ∏ piai, 当∑piai ≤ n时是满足题意的. 最简单我们令循环长度分别为piai, ...
- 【BZOJ1025】[SCOI2009]游戏(动态规划)
[BZOJ1025][SCOI2009]游戏(动态规划) 题面 BZOJ 洛谷 题解 显然就是一个个的置换,那么所谓的行数就是所有循环的大小的\(lcm+1\). 问题等价于把\(n\)拆分成若干个数 ...
- bzoj千题计划116:bzoj1025: [SCOI2009]游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=1025 题目转化: 将n分为任意段,设每段的长度分别为x1,x2,…… 求lcm(xi)的个数 有一个 ...
随机推荐
- 萌新学渗透系列之Hack The Box_Lame
我将我的walkthrough过程用视频解说的形式记载 视频地址https://www.bilibili.com/video/BV1Mv411z75c 一是因为看我视频的后来者应该都是刚入门的新手,视 ...
- OceanBase安装和使用
链接 https://mp.weixin.qq.com/s?spm=a2c6h.12873639.0.0.41f92c9bH5FL2Y&__biz=MzU3OTc2MDQxNg==&m ...
- vue脚手架创建项目名字报错
vue inti webpack TimeManger 报错 Sorry, name can no longer contain capital letters 原来这个capital是大写的意思,上 ...
- statsmodels 示例
Statsmodels 示例 https://www.statsmodels.org/stable/examples/index.html
- WSGI应用程序示例
import time # WSGI允许开发者自由搭配web框架和web服务器 def app(environ,start_response): status = '200 OK' response_ ...
- PHP ezmlm_hash() 函数
定义和用法 ezmlm_hash() 函数用于在 MySQL 数据库中保存 EZMLM 邮件列表的哈希值. 该函数接收一个 Email 地址参数,返回一个整数哈希值. 语法 int ezmlm_has ...
- PHP stristr() 函数
实例 查找 "world" 在 "Hello world!" 中的第一次出现,并返回字符串的剩余部分: <?php高佣联盟 www.cgewang.com ...
- PHP simplexml_import_dom() 函数
实例 获取 DOM 文档节点并转换为 SimpleXML 节点: <?php$dom=new domDocument;高佣联盟 www.cgewang.com$dom->loadXML(& ...
- 数据量大了一定要分表,分库分表组件Sharding-JDBC入门与项目实战
最近项目中不少表的数据量越来越大,并且导致了一些数据库的性能问题.因此想借助一些分库分表的中间件,实现自动化分库分表实现.调研下来,发现Sharding-JDBC目前成熟度最高并且应用最广的Java分 ...
- 【小白学AI】八种应对样本不均衡的策略
文章来自:微信公众号[机器学习炼丹术] 目录 1 什么是非均衡 2 8种解决办法 2.1 重采样(四种方法) 2.2 调整损失函数 2.3 异常值检测框架 2.4 二分类变成多分类 2.5 EasyE ...