版权声明:欢迎转载,请注明此博客地址。 https://blog.csdn.net/Ever_glow/article/details/82796705
题意是:给出一个环形的字符串,'R'和'P'分别代表岩石和池塘,一只青蛙从任意的地点出发,跳k步之后到达起点,问有多少这样的k满足题目要求。
易知当 gcd(n,k) 满足条件时,此时的答案是可行的,所以只需要枚举n的因子即可。最外层枚举因子,内层枚举起点,最内层枚举需要走的步数,当最后走完时并未走到岩石,说明此时的因子是一种可行方案,记录。时间复杂度为n的因子数*因子*n的因子数,大约在O(nlog^2)左右。
代码实现:
/*
Look at the star
Look at the shine for U
*/
#include<bits/stdc++.h>
#define ll long long
#define PII pair<int,int>
#define sl(x) scanf("%lld",&x)
using namespace std;
const int N = 1e6+5;
const int mod = 1e9+7;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1);
ll inv(ll b){if(b==1)return 1; return (mod-mod/b)*inv(mod%b)%mod;}
ll fpow(ll n,ll k){ll r=1;for(;k;k>>=1){if(k&1)r=r*n%mod;n=n*n%mod;}return r;}
char s[N];
int vis[N];
int main()
{
int n,i,j,k;
scanf("%s",s);
n = strlen(s);
for(i = 1;i < n;i++)
{
if(n%i) continue;
for(j = 0;j < i;j++)
{
int flag = 1;
for(k = 0;k <= n/i;k++)
{
if(s[(j+k*i)%n] == 'P')
{
flag = 0;
break;
}
}
if(flag)
{
vis[i] = 1;
break;
}
}
}
ll ans = 0;
for(i = 1;i < n;i++) if(vis[__gcd(n,i)]) ans++;
printf("%lld\n",ans);
}