Jumping frog Gym - 101889J

版权声明:如有错误,请指出,不胜感激。 https://blog.csdn.net/qq_36424540/article/details/82940164

思维题:

一种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;
}

猜你喜欢

转载自blog.csdn.net/qq_36424540/article/details/82940164