突然发现题刷累了写写题解还是满舒服的


题目大意:

给你一个只包含 \(R\) , \(P\) ,长度为 \(n\) 的字符串( \(3\le n\le 10^5\) )。你可以选择一个跳跃距离 \(l\) ( \(1\le l\le n-1\) ),并对于每一种跳跃距离,你可以随意选择一个起点,进行若干次跳跃后回到起点(字符串首尾相接构成一个环),问有多少种距离是满足存在一种跳跃情况使得期间没有经过 \(P\) 。

题解:

经过若干次尝试,我们可以轻易的发现,任意一个跳跃距离 \(l\) ,他完全等价与跳跃距离为 \(gcd(l,n)\) 的情况,也就是说,我们如果可以判断出 \(n\) 的所有可能的 \(gcd\) ,再判断,同时计算出与 \(n\) 有着此 \(gcd\) 的数的个数,我们就可以计算答案了。

\(n\) 的所有可能的 \(gcd\) 就是 \(n\) 的因数,我们可以用线性筛筛素数,再分解质因数,最后得出所有的因数并判断,复杂度在 \(O(n\sqrt{n})\) 左右。

然后我们考虑如何得出对于每一种因数,有多少个数与 \(n\) 的 \(gcd\) 为它。我们设 \(gcd(l,n)=x\) ,易得 \(gcd(l/x,n/x)=1\) ,所以我们就相当于求在 \(1\sim n/x-1\) 中,有多少个数与 \(n/x\) 互质,这不就是 $\varphi $ 函数吗?处理 $\varphi $ 函数可以放在线性筛中,这里的复杂度为 \(O(n)\) 。

总复杂度为 \(O(n\sqrt{n})\) 左右。

作者辛辛苦苦写完了题解,才发现可以直接 \(dp\) ,不需要这么麻烦,枯了。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
char s[N];
int len;
int eul[N],pri[N],lpri=0;
int cnt[N];
bool vis[N];
int ans=0;
int gcd(int a,int b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
bool tag[N];
void dfs(int now,int sum)
{
if(now>lpri)
{
if(len%sum)
return ;
int cnt=sum;
memset(tag,0,sizeof(tag));
for(int i=1;i<=len;++i)
{
if(s[i]=='R')
continue;
if(!tag[i%sum])
{
tag[i%sum]=true;
--cnt;
}
}
if(cnt)
ans+=eul[len/sum];
return ;
}
int tmp=1;
for(int i=0;i<=cnt[now];++i)
{
dfs(now+1,sum*tmp);
tmp*=pri[now];
}
return ;
}
int main()
{
scanf("%s",s+1);
len=strlen(s+1);
for(int i=2;i<=len;++i)
{
if(!vis[i])
{
eul[i]=i-1;
pri[++lpri]=i;
}
for(int j=1;j<=lpri;++j)
{
if(i*pri[j]>len)
break;
vis[i*pri[j]]=true;
if(i%pri[j])
eul[i*pri[j]]=eul[i]*eul[pri[j]];
else
{
eul[i*pri[j]]=eul[i]*pri[j];
break;
}
}
}
int tmp=len;
for(int i=1;i<=lpri;++i)
{
while(tmp%pri[i]==0)
{
tmp/=pri[i];
++cnt[i];
}
}
dfs(1,1);
printf("%d\n",ans);
}

GYM101889J Jumping frog的更多相关文章

  1. Gym101889J. Jumping frog(合数分解+环形dp预处理)

    比赛链接:传送门 题目大意: 一只青蛙在长度为N的字符串上跳跃,“R”可以跳上去,“P”不可以跳上去. 字符串是环形的,N-1和0相连. 青蛙的跳跃距离K的取值范围是[1, N-1],选定K之后不可改 ...

  2. 2017-2018 ACM-ICPC Latin American Regional Programming Contest J - Jumping frog 题解(gcd)

    题目链接 题目大意 一只青蛙在长度为N的字符串上跳跃,"R"可以跳上去,"P"不可以跳上去. 字符串是环形的,N-1和0相连. 青蛙的跳跃距离K的取值范围是[1 ...

  3. Generative Adversarial Nets[CycleGAN]

    本文来自<Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks>,时间线为2017 ...

  4. Gym 101889:2017Latin American Regional Programming Contest(寒假自训第14场)

    昨天00.35的CF,4点才上床,今天打的昏沉沉的,WA了无数发. 题目还是满漂亮的. 尚有几题待补. C .Complete Naebbirac's sequence 题意:给定N个数,他们在1到K ...

  5. 2017-2018 ACM-ICPC Latin American Regional Programming Contest Solution

    A - Arranging tiles 留坑. B - Buggy ICPC 题意:给出一个字符串,然后有两条规则,如果打出一个辅音字母,直接接在原字符串后面,如果打出一个元音字母,那么接在原来的字符 ...

  6. 训练20191007 2017-2018 ACM-ICPC Latin American Regional Programming Contest

    2017-2018 ACM-ICPC Latin American Regional Programming Contest 试题地址:http://codeforces.com/gym/101889 ...

  7. 2017-2018 ACM-ICPC Latin American Regional Programming Contest PART (11/13)

    $$2017-2018\ ACM-ICPC\ Latin\ American\ Regional\ Programming\ Contest$$ \(A.Arranging\ tiles\) \(B. ...

  8. 2017年上海金马五校程序设计竞赛:Problem I : Frog's Jumping (找规律)

    Description There are n lotus leaves floating like a ring on the lake, which are numbered 0, 1, ..., ...

  9. CF1146D Frog Jumping

    CF1146D Frog Jumping 洛谷评测传送门 题目描述 A frog is initially at position 00 on the number line. The frog ha ...

随机推荐

  1. IP 层收发报文简要剖析6--ip_forward 报文转发

    //在函数ip_route_input_slow->ip_mkroute_input注册, /* * IP数据包的转发是由ip_forward()处理,该函数在ip_rcv_finish() * ...

  2. Innodb表空间迁移过程

    1.大致流程 将a实例的表的数据迁移到b实例上. 1.在目标实例b上创建一个相同的表 2.在目标库b上执行ALTER TABLE t DISCARD TABLESPACE; 3.在源库a上执行FLUS ...

  3. CTF练习(1)这是一张单纯的图片?

    1.练习平台http://123.206.31.85/challenges 2.图片下载后放进WInhex 最后安利一个  CTF资源库|CTF工具包|CTF工具集合 网站,里面工具很全,很方便   ...

  4. property,类方法和静态方法

    # from math import pi # # class Circle: # def __init__(self, r): # self.r = r # # @property # def pe ...

  5. 正则表达式——maltrail工程项目中使用

    1. 正则表达所需语法 \ 正则表达式使用反斜杠字符 ('') 来表示特殊形式或是允许在使用特殊字符时不引发它们的特殊含义. 转义特殊字符(允许你匹配 '*', '?', 或者此类其他) \A 只匹配 ...

  6. FL Studio录制面板知识讲解

    FL Studio录制面板可以设置与录制有关的选项,它还有一个用来设置音符对齐的全局吸附选择器.刚接触水果这款音乐制作软件的同学通常不是很清楚这里的知识的,下面小编就给大家讲解一下. 1.首先,我们来 ...

  7. 手把手教你用思维导图软件iMindMap制作计划表

    在日常生活中小编也经常使用思维导图软件iMindMap来创建思维导图以规划工作及学习的安排.尤其是时间安排类型的思维导图,能极大程度的节约我们的时间,接下来就由小编以自己假期的社会实践向大家分享一下怎 ...

  8. 从维基百科等网站复制数据和公式到MathType里编辑

    在我们写论文的时候,经常会需要用一些实际案例以及数据,而这些数据和案例有很大一部分可以直接在网络上找到.但是有时候也会发现我们想要的内容和公式,从网页上复制粘贴后太模糊,不适合打印和投影.就需要我们将 ...

  9. 微课制作软件Camtasia,来为视频添加预设动画效果

    之前已介绍过使用微课制作软件Camtasia为视频添加"缩放和平移"动画的教程以及"效果按钮"的使用. 此篇内容,我们就来介绍使用录像编辑软件--Camtasi ...

  10. Java Bean拷贝工具Orika原理解析

    最近面试被问及对象拷贝怎样才能高效,实际上问的就是Orika或者BeanCopier的原理.由于网上对Orika原理的解析并不太多-因此本文重点讲解一下Orika的原理.(Orika是基于JavaBe ...