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


题目大意:

给你一个只包含 \(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. Ubuntu18.04上安装CUDA_10.1(nvidia-driver)和cuDNN_7.6.5

    本文是在Ubuntu18.04.5服务器上安装CUDA_10.1(nvidia-driver455)和cuDNN_7.6.5, Ubuntu 18.04.5 CUDA_10.1 (nvidia-dri ...

  2. 差分进化算法介绍及matlab实现

    引言 差分进化算法是基于群体智能理论的优化算法,是通过群体内个体间的合作与竞争而产生的智能优化搜索算法,它保留了基于种群的全局搜索策略,采用实数编码.基于差分的简单变异操作和"一对一&quo ...

  3. 通过ceph-deploy安装不同版本ceph

    之前有在论坛写了怎么用 yum 安装 ceph,但是看到ceph社区的群里还是有人经常用 ceph-deploy 进行安装,然后会出现各种不可控的情况,虽然不建议用ceph-deploy安装,但是既然 ...

  4. JVM(一)-JVM入门

    JVM的定义: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的 ...

  5. 分布式监控系统之Zabbix网络发现

    前文我们了解了zabbix的宏,自定义item和模板的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14013331.html:今天我们来了解下zab ...

  6. 深度分析:面试腾讯,阿里面试官都喜欢问的String源码,看完你学会了吗?

    前言 最近花了两天时间,整理了一下String的源码.这个整理并不全面但是也涵盖了大部分Spring源码中的方法.后续如果有时间还会将剩余的未整理的方法更新到这篇文章中.方便以后的复习和面试使用.如果 ...

  7. Ubuntu16.04安装搜狗输入法报错:dkpg:处理归档sogoupinyin.deb(--install)时出错,安装sogoupinyin将破坏fcitx-ui-qimpanel

    系统:ubuntu16.04 事件:安装搜狗拼音时报错 报错信息(ubuntu语言是英文的报错信息): dpkg: regarding sogoupinyin_2.3.2.07_amd64-831.d ...

  8. 【Redis】【报错】redis.exceptions.ResponseError: DENIED Redis is running in protected mode

    (一)报错前提 写flask 项目的时候,因为连接了私有云中的redis地址指定了IP host,启动项目的时候报错 (二)解决方法 首先要切换到root用户 root@:/etc/redis# pw ...

  9. appium快速入门

    appium快速入门 演示官方demo 第一步:启动安卓模拟器 步骤2:启动Appium桌面 step3:准备自动化脚本与待测APK step4:运行测试代码 分析演示 分析Appium的加载流程 使 ...

  10. Linux服务器学习----haproxy+keepalived

    实验需要4台虚拟机,两台做服务器,两台做代理服务器 www1:ip:10.30.40.11       hk1: 代理:10.30.40.13(hk1.netdj.net) www2:ip  10.3 ...