1. 程式人生 > >Jumping frog Gym

Jumping frog Gym

思維題:

一種K方案可行,那麼gcd(n,K) 肯定是可行的,然後驗證就好了。

啟示: 貌似超時,實際上,只需要驗證 n 的因子就行了,根本就不多。 下次看見gcd(),想想因子,就會很舒服。

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

const int N=1e5+10;

char s[N*2];
/*
RRR
RRPR
PRP
*/
int rec[N];

bool vis[N];
int check(int x,int len){
	memset(vis,0,sizeof(vis));
	for(int i=0;i<len;i++){

		if(vis[i]||s[i]=='P')continue;
		//vis[i]=1;
		//printf("x:%d i:%d\n",x,i);
		vis[i]=1;
		int t=(i+x)%len,ok=1;
		while(t!=i){
			if(vis[t]||s[t]=='P'){
				ok=0;break;
			}
			vis[t]=1;
			t=(t+x)%len;
		}
		if(ok)return 1;
	}
	return 0;
}

int main(){

    while(scanf("%s",s)==1){

        int len=strlen(s);
		fill(rec,rec+len+1,-1);
		int ans=0;
		for(int i=1;i<len;i++){
			int t=__gcd(i,len);
			if(rec[t]!=-1){
				rec[i]=rec[t];
				ans+=rec[i];
			}
			else{
				ans+=(rec[t]=check(i,len));
			}
		}

		//for(int i=1;i<len;i++)printf("i:%d %d\n",i,rec[i]);


		printf("%d\n",ans);
    }
    return 0;
}