[Luogu5181][COCI2009]GENIJALAC

题目链接:

Luogu5181

一个简单题?

首先对\([C+1,n-D]\)中的每个数字求出循环节,求\(Lcm\)即是整段的循环节。

然后判断\([A,B]\)中有几个数满足\(x-1\equiv 0(mod\ Lcm)\)。

求循环节暴力可过。。

其实求循环节是可以\(O(n)\)的。

每一次求循环节得到一个环,那么环上所有点的循环节都是此次求出的循环节。

那么就可以\(O(n)\)得到所有循环节。

代码:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
typedef long long ll;

const ll llMax=1e13;
ll Gcd(const ll a,const ll b){return b?Gcd(b,a%b):a;}
ll Lcm(const ll a,const ll b){return a/Gcd(a,b)*b;}
int n,s[500005];
bool v[500005];
ll a,b,c,d,Mfo=1;

void DFS(const int x,const int St,const int Nt)//x 现在的位置 St 此次起点 Nt 已经经过节点数
{
    if(v[x])
    {
        if(x!=St)puts("0"),exit(0);//形成环,但是St不在环上,即St没有循环节
        Mfo=Lcm(Mfo,Nt);//求Lcm
        if(Mfo>=llMax)puts("0"),exit(0);//循环节过大,那么[A,B]中没有满足要求的数
        return;
    }
    v[x]=true,DFS(s[x],St,Nt+1);
}

int main()
{
    std::cin>>n>>a>>b>>c>>d;
    for(int i=1;i<=n;++i)scanf("%d",&s[i]);
    for(int i=c+1;i<=n-d;++i)
        if(!v[i])DFS(i,i,0);//不求减去的
    ll l=std::max(a-1,(ll)1),r=std::max(b-1,(ll)1);//把[A,B]中所有数-1,求有多少数是Lcm的倍数
    if(l%Mfo)l=(l/Mfo+1)*Mfo;
    if(r%Mfo)r=r/Mfo*Mfo;
    std::cout<<(r-l)/Mfo+1+(a==1)<<std::endl;//特判第1个
    return 0;
}

原文地址:https://www.cnblogs.com/LanrTabe/p/10370039.html

时间: 2024-10-12 19:47:38

[Luogu5181][COCI2009]GENIJALAC的相关文章

bzoj3087: Coci2009 misolovke

Description [misolovke]给定一个 N*N 的网格.每个格子里至少会有一个捕鼠器, 并且已知每个格子里的捕鼠器个数.现在需要在 每一行 中选取恰好 K 个连续的格子, 把里面的捕鼠器全部拿走, 并且需要满足 老鼠不能 从网格最左边到网格最右边 也不能 从网格最上面到网格最下面 老鼠行走的方向是 上下左右 4个方向 老鼠只能经过没有捕鼠器的格子求拿走捕鼠器个数的最大值 Input 第1行: 2 个整数 N, K (2 <= N <= 250, 1 <= K <=

bzoj3086: Coci2009 dvapravca

Description 给定平面上的 N 个点, 其中有一些是红的, 其他是蓝的.现在让你找两条平行的直线, 使得在保证    不存在一个蓝色的点 被夹在两条平行线之间,不经过任何一个点, 不管是蓝色点还是红色点的前提下, 被夹在平行线之间的红色点个数最多 Input 第1行: 一个整数 N (1 <= N <= 1000)    第2..N+1行: 每行是一个点的坐标以及它的颜色.                坐标用2个 绝对值<10^9 的整数表示                颜

COCI2009 PATULJCI

给出N个人的颜色,有c种不同的颜色.给出查询次数M查找区间[L,R],对于每次查询操作,问在区间[L,R]是否有有一种颜色的出现的次数>(L+R)/2,如果有,输出yes及颜色的种类,否则输出no. 暴搜大概能过3个点.我的最先思路是对于每种颜色都求一个前缀和,然后每次的查询操作时间复杂度就是O(1),但是光是为了记录颜色的颜色和就已经超时了,而且还要暴内存,于是我们不得不寻求更简便的方法. 每种颜色我们可以按大小排序,大小相同的按出现位置排序,并记录下每一个颜色的出现的位置,保存在一个数组里边

BZOJ2223:[Coci2009]PATULJCI——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=2223 Description Sample Input 10 3 1 2 1 2 1 2 3 2 3 3 8 1 2 1 3 1 4 1 5 2 5 2 6 6 9 7 10 Sample Output no yes 1 no yes 1 no yes 2 no yes 3 HINT Notice:输入第二个整数是序列中权值的范围Lim,即1<=ai(1<=i<=n)<=Lim. 1

【2019.10.18】luogu TG5动态规划进阶

树形dp P1352 没有上司的舞会 P2607 骑士(review) 对于每一个"联通快" 只有根节点有机会形成环 强制不选\(rt\)和\(rt\)的父亲 各跑一遍 P1131 时态同步(review) 贪心 显然增加深度约小的边越优 从下到上来调整 先将同一个点的儿子们延伸到一样 再往上进行一样的操作 //apio 烟火 树上背包? 一棵\(n\)个点的树,有点权.选择一个大小不超过\(K\)的联通块,使得点权和最大.\(n ≤ 2000\) \(f(x, i)\)表示\(x\)