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


题目大意:

给你一个只包含 \(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. select的限制

    /*一.select实现并发服务器并发的两点限制 1.一个进能够打开的最大文件描述符限制.可以通过两种方式修改 ulimit -n :获取最大文件描述符个数 ulimit -n 2048:修改为204 ...

  2. 再聊 Blazor,它是否值得你花时间学习

    之前写了一篇文章<快速了解 ASP.NET Core Blazor>,大家关心最多的问题是,我该不该花时间去学习 Blazor.今天聊聊这个话题,并表达一下我个人的看法. 在此之前,我还是 ...

  3. yum安装指定版本ceph包

    安装ceph包的方式有很多,这里讲的是从官网直接通过yum源的安装方式进行安装 yum源对应的地址为 http://download.ceph.com/rpm-hammer/el6/x86_64/ 怎 ...

  4. Python 调用Get接口

    import requests,jsonurl = 'http://localhost:30627/api/jobs/GetNuberId?id=2'req = requests.get(url)re ...

  5. SNMP介绍及使用,超有用,建议收藏!

    写在前面 如果你是对SNMP完全不了解,或者只想学习如何使用现成的SNMP工具,那你找对了文章,但如果你希望学习SNMP具体协议内容,推荐阅读官方的RFC文档. 1. 简介 SNMP(Simple N ...

  6. "三剑客"之awk心中无剑

    一.awk介绍 awk 是一种程序语言. 它具有一般程序语言常见的功能. 因awk语言具有某些特点, 如 : 使用直译器(Interpreter)不需先行编译; 变量无类型之分(Typeless), ...

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

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

  8. Mac中的格式转换如何用读写工具Tuxera NTFS完成

    Tuxera NTFS for Mac是一款专门为Mac用户提供的NTFS驱动软件,它不仅可以进行磁盘文件的访问.编辑.传输和存储,还可以对硬盘进行维修检查以及修复. 今天小编就给大家简单介绍一下Tu ...

  9. HTML+JavaScript画函数图像

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. crash安装使用

     cash作为Linux内核调试的工具是必不可少少的一部分,但是他的下载并不是 yum install一下这么简单的,本文就来讲一下如何安装crash进行调试.  首先就是了解Linux的内核版本.这 ...