codeforces gym 101889J – Jumping Frog ( 數學+ 思維 好題 )
阿新 • • 發佈:2018-12-13
思路 :青蛙每次跳長度為len 的距離,如果想要回到原點,那麼青蛙跳的點數一定是固定的,把跳過的點標記成紅色,那麼相鄰的兩個紅點之間的距離也一定是字串長度n 的因子。那麼就問題就可以轉化成每次跳長度為兩個紅點的距離,能否滿足題意。那麼我就可以直接暴力處理長度n 的所有因子是否可以。因為n的因子不會很多,所以是一個nlogn 的複雜度。
程式碼:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N =1e5+5; char s[N]; int vis[N]; int n; int main() { scanf("%s",s+1); n=strlen(s+1); for(int len=1;len<n;len++) { if(n%len==0){ int ff=0; for(int p=1;p<=len;p++){ int pos=p; int f=0; while(pos<=n){ if(s[pos]=='P'){ f=1; break; } pos+=len; } if(f==0){ ff=1; break; } } if(ff){ vis[len]=1; } } } int ans=0; for(int i=1;i<n;i++){ if(vis[__gcd(i,n)]) ans++; } printf("%d\n",ans); return 0; }