Jumping frog Gym
阿新 • • 發佈:2018-12-13
思維題:
一種方案可行,那麼 肯定是可行的,然後驗證就好了。
啟示: 貌似超時,實際上,只需要驗證 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; }