ICPC Latin American Regional – 2017 J Jumping Frog

版权声明:欢迎转载,请注明此博客地址。 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);
}

猜你喜欢

转载自blog.csdn.net/Ever_glow/article/details/82796705