版权声明:如有错误,请指出,不胜感激。 https://blog.csdn.net/qq_36424540/article/details/82940164
思维题:
一种方案可行,那么 肯定是可行的,然后验证就好了。
启示: 貌似超时,实际上,只需要验证 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;
}