1. 程式人生 > >ICPC Latin American Regional – 2017 J Jumping Frog

ICPC Latin American Regional – 2017 J Jumping Frog

題意是:給出一個環形的字串,'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);
}