比赛链接:传送门

题目大意:

  一只青蛙在长度为N的字符串上跳跃,“R”可以跳上去,“P”不可以跳上去。

  字符串是环形的,N-1和0相连。

  青蛙的跳跃距离K的取值范围是[1, N-1],选定K之后不可改变。

  要求青蛙最后能跳回起点(起点可以是0-N-1的任意一个位置),问K的取值有多少种选择。

  3≤N≤105

思路:

  考虑到如果gcd(N, K) = g,则从起点开始跳的话,所有经过的点都是g的倍数,而且每个g的倍数都会经过。

  所以只要考虑从任意一个点i开始,步长为g地跳,能不遇见"P"而跳到N+i的位置的话,那么这个K可以选。

  直接模拟的话就O(N2logN)了,考虑优化。

  因为对于确定的g,对应的有很多个K,而这些K的选与不选是确定的,所以考虑枚举g(其实就是N的约数),对每个g预处理出它是否能满足题意地完成条件。

  没记错的话约数的数量应该是logN级别的,所以环形dp预处理的复杂度为O(NlogN)。

  然后枚举一遍K,更新答案就可以了。

  复杂度O(NlogN + NlogN)。

代码:

#include <bits/stdc++.h>

using namespace std;
const int MAX_N = 1e5 + ; int N;
char S[MAX_N]; vector <int> factor;
void getFactors(int N)
{
factor.clear();
for (int i = ; i <= N/i; i++) {
if (N%i == ) {
factor.push_back(i);
if (i*i != N)
factor.push_back(N/i);
}
}
sort(factor.begin(), factor.end());
} bool f[MAX_N << ][];
bool can_jump[MAX_N];
void dp()
{
int cnt = factor.size();
memset(f, false, sizeof f);
for (int i = ; i <= *N; i++) {
for (int j = ; j < cnt; j++) {
int tmp = factor[j];
if (S[(i-)%N] == 'P')
f[i][j] = false;
else if (S[(i-)%N] == 'R') {
if (i-tmp <= )
f[i][j] = true;
else
f[i][j] = f[i-tmp][j];
}
}
} memset(can_jump, false, sizeof can_jump);
for (int i = N+; i <= *N; i++) {
for (int j = ; j < cnt; j++) {
int tmp = factor[j];
if (f[i][j])
can_jump[tmp] = true;
}
}
} inline int gcd(int a, int b)
{
return a%b ? gcd(b, a%b) : b;
} int main()
{
scanf("%s", S);
N = strlen(S);
getFactors(N);
dp(); int ans = ;
for (int k = ; k <= N-; k++) {
int g = gcd(k, N);
if (can_jump[g])
ans++;
}
cout << ans << endl;
return ;
}

Gym101889J. Jumping frog(合数分解+环形dp预处理)的更多相关文章

  1. GYM101889J Jumping frog

    突然发现题刷累了写写题解还是满舒服的 题目大意: 给你一个只包含 \(R\) , \(P\) ,长度为 \(n\) 的字符串( \(3\le n\le 10^5\) ).你可以选择一个跳跃距离 \(l ...

  2. hdu 5317 合数分解+预处理

    RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  3. Luogu【P1880】石子合并(环形DP)

    先放上luogu的石子合并题目链接 这是一道环形DP题,思想和能量项链很像,在预处理过程中的手法跟乘积最大相像. 用一个m[][]数组来存储石子数量,m[i][j]表示从第 i 堆石子到第 j 堆石子 ...

  4. HDU 4610 Cards (合数分解,枚举)

    Cards Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  5. hdu_4497GCD and LCM(合数分解)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 GCD and LCM Time Limit: 2000/1000 MS (Java/Other ...

  6. hdu 4777 树状数组+合数分解

    Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. Perfect Pth Powers pku-1730(筛+合数分解)

    题意:x可以表示为bp, 求这个p的最大值,比如 25=52, 64=26,  然后输入x 输出 p 就是一个质因子分解.算法.(表示数据上卡了2个小时.) 合数质因子分解模板. ]; ]; ; ;n ...

  8. pku1365 Prime Land (数论,合数分解模板)

    题意:给你一个个数对a, b 表示ab这样的每个数相乘的一个数n,求n-1的质数因子并且每个指数因子k所对应的次数 h. 先把合数分解模板乖乖放上: ; ans != ; ++i) { ) { num ...

  9. HDU 4497 GCD and LCM (合数分解)

    GCD and LCM Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total ...

随机推荐

  1. .net实现网易云音乐下载

    客户端版的网易云音乐下载是需要vip的,网页版的虽然可以通过调试工具找到下载链接,但是用起来不是很方便,通过调试工具观察请求发现请求参数都是加密的,比如搜索歌曲的请求参数: 这个加密的实现肯定是写在j ...

  2. python中一些传参事情

    #一个参数的传参 def hello(a):    print(a+'王彦军你好')hello('hello')''' #2个参数的 def ab(a,b):    print(a+'你好')    ...

  3. 6ci

  4. K2百家讲坛 | 越秀地产:K2为房企数字化转型带来更多可能

    随着数字化经济时代的到来,房地产行业逐渐形成了新的竞争和市场格局,房企要在此背景下实现稳步发展,需要由原本的粗放式管理逐渐向集团性管理.精细化管控转变,这对房企的经营发展战略和业务管理方式都提出了不小 ...

  5. java ee 思维导图

    http://download.csdn.net/download/g290095142/10149996 这是原地址,我觉得很棒,就下载下来用xmind看了看,发现很全面的.

  6. vs2017 无法提交到tfs的 git存储库

    tfs 是2018版本 使用git 工具是可以提交成功. 使用vs2017的 就会一直提示 授权失败 也可以使用新安装的git https://blog.csdn.net/Meteor_s/artic ...

  7. vs问题--------------标记为系统必备组建...

    问题:标记为系统必备组建 要将程序集“D:\project\DMS\DMSGaeaService\TmsApplication\bin\Debug\Jns.Gaea.dll”标记为系统必备组件,必须对 ...

  8. Python机器学习(基础篇---监督学习(k近邻))

    K近邻 假设我们有一些携带分类标记的训练样本,分布于特征空间中,对于一个待分类的测试样本点,未知其类别,按照‘近朱者赤近墨者黑’,我们需要寻找与这个待分类的样本在特征空间中距离最近的k个已标记样本作为 ...

  9. 【转】Android-Input input&按键布局文件

    https://source.android.com/devices/input 输入 Android 输入子系统名义上是由遍历系统多个层的事件管道组成. 输入管道 在最低层,物理输入设备会生成描述状 ...

  10. TCPIP学习笔记

    TCP的连接 状态变化 各个状态的意义如下: LISTEN - 侦听来自远方TCP端口的连接请求: SYN-SENT -在发送连接请求后等待匹配的连接请求: SYN-RECEIVED - 在收到和发送 ...