时间限制 1s 空间限制 512MB

3.1 题目描述

“Geronimo∼”

时间还很多,让我们慢慢来。

不如听首开心的歌再看题?…… 算了,直接看题吧。

给定一个整数 n,以及一个 n 阶的排列 p 1 , p 2 , …, p n 。

我们定义重组过程如下:如果当前的排列是 a 1 , a 2 , …, a n ,经过一次重组,就会

变成 p a 1 , p a 2 , …, p a n 。

问一个排列至少要经过多少次重组才会恢复成重组前的状态。

由于答案可能很大,输出其对一个给定的正整数 q 取模的值即可。

3.2 输入格式

第一行两个正整数 n, q。

第二行一共 n 个整数,依次表示 p 1 , p 2 , …, p n 。

同一行相邻的数间用一个空格隔开。

3.3 输出格式

一行一个整数,表示答案对 q 取模的值。

3.4 样例输入

7 1000000207

2651347

3.5 样例输出

4

3.6 数据规模和约定

对于全部的数据,q ≤ 2 × 10 9

对于 10% 的数据,q = 1

对于另外 20% 的数据,n ≤ 9

6对于另外 40% 的数据,n ≤ 10 3

对于剩下 30% 的数据,n ≤ 5 × 10 5

【题解】

这道题就是找出每个点恢复初始状态的步数(或者称为找个环),再求出这些步数的最大公约数即可。

(然而我考试时打了个愚蠢的10分暴力)

但注意有几点优化:

1、一个环上所有点恢复初始状态的步数相同(解决TLE问题)

2、求一群数的最大公约数,可以一一找出每一对数,求出两个数的最大公约数,再用后一个数除掉(用前一个数的话就是改掉当前搜索的数,会wa7个点),最后把剩下的数连乘即可。(另一种思路是线性筛打表出素数,看每个数的质因子)

3、恢复初始状态的步数相同的点的步数可去重,这里我用的是map(和vis一样)。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re ll i=a;i<=b;i++)
#define fq(i,a,b) for(re ll i=a;i>=b;i--)
using namespace std;
ll a[500005]={},c[500005]={},total=0;
bool vis[500005]={};
map<ll,ll>b;
il ll gi()
{
re ll x=0;
re ll t=1;
re char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
ll gcd(ll x,ll y)
{
if(y==0) return x;
return gcd(y,x%y);
}
int main()
{
freopen("geronimo.in","r",stdin);
freopen("geronimo.out","w",stdout);
ll n=gi(),q=gi();
if(q==1) {printf("0\n");return 0;}
fp(i,1,n)
a[i]=gi();
fp(i,1,n)
if(vis[i]==0)
{
ll j=a[i],sum=1;
while(j!=i) sum++,j=a[j];
j=a[i];
while(j!=i) vis[j]=1,j=a[j];
if(b[sum]==0) b[sum]=1,c[++total]=sum;
}
fp(i,1,total-1)
fp(j,i+1,total)
{
ll x=c[i],y=c[j];
if(x<y) swap(x,y);
ll r=gcd(x,y);
c[j]/=r;//beach,c[i]/=i会wa7个点,因为不能改当前数
}
ll ans=1;
fp(i,1,total)
ans=(1ll*ans*c[i])%q;
printf("%lld\n",ans);
fclose(stdin);
fclose(stdout);
return 0;
}

geronimo的更多相关文章

  1. Geronimo应用服务器和MySQL数据库服务器

    就是Web 2.0的全部,尽管该术语出现才几乎一年的时间,但现在好像只有烹饪杂志还没有加入到讨论Web 2.0未来出路的行列中.自从出现了里程碑式的文章"What Is Web 2.0:De ...

  2. Geronimo tomcat: 在 Apache Geronimo 插件体系中将 Apache Tomcat 这个优秀的 Web 容器整合至其中

    Apache Geronimo 灵活的插件体系将 Tomcat, OpenJPA, OpenEJB, ActiveMQ 等第三方组件集成至其中.本文从多角度介绍了在 Apache Geronimo 中 ...

  3. Geronimo 叛逆者: 使用集成软件包:Codehaus 的 Woodstox(转载)

    XML 解析器通常是高性能.健壮应用程序的关键.传统的 XML 解析技术包括文档对象模型(Document Object Model,DOM)和 Simple API for XML (SAX).现在 ...

  4. Apache Geronimo Remote Code Execute Vulnerability

    简介: Apache Geronimo 是 Apache 软件基金会的开放源码J2EE服务器,它集成了众多先进技术和设计理念. 这些技术和理念大多源自独立的项目,配置和部署模型也各不相同. Geron ...

  5. Java消息队列--ActiveMq 实战

    1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...

  6. 关于Karaf Container 4.0.7

            Karaf是Apache旗下的一个开源项目.Karaf同时也是一个基于OSGi的运行环境,Karaf提供了一个轻量级的OSGi容器,可以用于部署各种组件,应用程序.Karaf提供了很多 ...

  7. activemq和jms是种什么关系

    JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程. 而activemq则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者. jm ...

  8. ActiveMQ入门

    ActiveMQ简介 概要 开源 JMS-compliant 消息中间件message-oriented middleware(MOM) 松耦合,相对于RPC的紧耦合 发送消息fire-and-for ...

  9. Deployment options

    Play applications can be deployed virtually anywhere: inside Servlet containers, as standalone serve ...

随机推荐

  1. 如何快速的vue init 属于自己的vue模板?

    相信很多接触过vue的小伙伴非常熟悉了,我们在开启项目之前都需要vue init webpack xx来初始化自己的项目目录.但是在实际开发中我们往往会根据公司要求或者业务的需要会对目录进行局部的调整 ...

  2. HTML元素以及HTML元素的分类

    HTML元素以及HTML元素的分类 html标签又叫做html元素,它分为块级元素和内联元素(也可以叫做行内元素),都是html规范中的概念 块级元素 含义:块级元素是指本身属性为display:bl ...

  3. NOIP 2018 真・退役记

    目录 NOIp 2018 真・退役记 7.01 7.05 \(summary\) 7.12 7.18 7.26 - 7.27 8.2 8.3 8.3 8.7 8.9 8.20 8.24 8.27 8. ...

  4. Oracle 常用目录结构(10g)

    大多数情况下,了解Oracle常用目录结构,将大大提高数据库管理与维护的工作效率,本文介绍了Oracle 10g 的常用目录. OFA: 下面给出Oracle 最优灵活体系结构OFA(Optimal ...

  5. Struts2学习笔记:DMI,多个配置文件,默认Action,后缀

    动态方法调用有三种方法: 1.同一Action多次映射,每个action标签的method对应要调用的方法. 当要调用的方法多了就会增加struts.xml文件的复杂性. 2.struts.Dynam ...

  6. Leetcode题目practice

    目录 Leetcode题目解答 1. 删除最外层的括号 2. 两数之和 3. 宝石与石头 4. 移除元素 5.删除排序数组中的重复项 6.寻找两个有序数组的中位数 7.盛最多水的容器 8.存在重复元素 ...

  7. 洛谷 2048 BZOJ 2006 [NOI2010]超级钢琴

    [题解] 贪心题.设五元组(mx,pos,l,r1,r2)表示最大值为mx,取得最大值的区间右端点为pos,区间左端点为l,区间右端点的可选区间为[r1,r2]. 每次从堆里拎出最大值,然后把这个区间 ...

  8. angular环境安装与配置

    1.安装npm和nodejs,下载地址:https://nodejs.org/en/download/ node -v npm -v   2.配置淘宝代理,下载node_modules npm con ...

  9. const int * 和 int * const 傻傻分不清楚

    const int * a和int const *a一样,定义时不是必须初始化,指针可以指向其他变量,但是指向的变量的值不能修改. int * const定义时必须初始化,即必须指明指向哪个变量,定义 ...

  10. log4j2.xml 的配置 及使用

     log4j2.xml配置 <?xml version="1.0" encoding="UTF-8"?> <Configuration > ...