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


题目大意:

给你一个只包含 \(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. 压缩css与js

    使用yuicompressor 进行css和js的压缩 #! /bin/sh yasuocss="java -jar /root/yuicompressor-2.4.8.jar --type ...

  2. MFC的消息响应机制说明

    MFC的快速理解: 1.MFC的设计者们在设计MFC时,有一个主要的方向就是尽可能使得MFC的代码要小,速度尽可能快.为了这个方向,工程师们使用了许多技巧,主要表现在宏的运用上,实 现MFC的消息映射 ...

  3. SQL Server 不同数据间建立链接服务器进行连接查询

        在平时查询以及导数据时,经常会遇到需要使用两个数据库里数据的情况,这时就会用到在两个服务器之间建立一个链接,进行操作,脚本语句如下: 举例:例如你在测试服务器上想要查询业务库里的数据信息,此脚 ...

  4. Java编发编程 - 线程池的认识(二)

    核心线程池的内部实现 依然参考 JDK 对线程池的支持,各个接口.相关类之间的关系:  (1)对于Executors中几个创建线程池方法底层实现: // 创建固定线程数量的线程池 public sta ...

  5. webpack : 无法加载文件 C:\Users\Eileen\AppData\Roaming\npm\webpack.ps1,因为在此系统上禁止运行脚本

    报错内容: webpack : 无法加载文件 C:\Users\Eileen\AppData\Roaming\npm\webpack.ps1,因为在此系统上禁止运行脚本.有关详细信息,请参阅 http ...

  6. CTF-Web-强网杯 2019-随便注

    题目链接 题目链接-supersqli FUZZ测试 fuzz出,order by测出数据库查询列数2列,注释符号#,select|update|delete|drop|insert|where|被过 ...

  7. vue中使用transition和animate.css动画效果

    一.单个动画中,使用div中引用animate动画 1.下载依赖 npm install animate.css –save 2.main.js中全局引用 import animate from 'a ...

  8. 转化dataframe中一组序列为时间序列的方法-to_datetime()的最新用法

    一.to_datetime()的最新用法: hs300_hf['date'] = pd.to_datetime(hs300_hf['date']) hs300_hf.set_index('date', ...

  9. FL Studio钢琴卷轴之画笔工具

    在FL Studio中,钢琴卷轴窗口是制作音乐很重要的一个窗口,大部分音乐编辑的工作都要在该窗口中完成.钢琴卷轴的概念来源于旧时自动机械钢琴所使用的纸质卷轴,在钢琴卷轴中,纵轴代表音符的高度,横轴代表 ...

  10. FL Studio乐理教程之调式音阶

    在我们使用FL制作音乐时,乐理是必不可少的制作基础,本篇教程将结合FL Studio为大家讲解基础乐理及在FL Studio20中的使用技巧. 添加一个乐器,打开Piano Roll(钢琴窗). 首先 ...