链接:http://codeforces.com/gym/101889/attachments
思路 :青蛙每次跳长度为len 的距离,如果想要回到原点,那么青蛙跳的点数一定是固定的,把跳过的点标记成红色,那么相邻的两个红点之间的距离也一定是字符串长度n 的因子。那么就问题就可以转化成每次跳长度为两个红点的距离,能否满足题意。那么我就可以直接暴力处理长度n 的所有因子是否可以。因为n的因子不会很多,所以是一个nlogn 的复杂度。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =1e5+5;
char s[N];
int vis[N];
int n;
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
for(int len=1;len<n;len++)
{
if(n%len==0){
int ff=0;
for(int p=1;p<=len;p++){
int pos=p;
int f=0;
while(pos<=n){
if(s[pos]=='P'){
f=1; break;
}
pos+=len;
}
if(f==0){
ff=1; break;
}
}
if(ff){
vis[len]=1;
}
}
}
int ans=0;
for(int i=1;i<n;i++){
if(vis[__gcd(i,n)]) ans++;
}
printf("%d\n",ans);
return 0;
}