ICPC Latin American Regional – 2017 J Jumping Frog
阿新 • • 發佈:2018-12-11
題意是:給出一個環形的字串,'R'和'P'分別代表岩石和池塘,一隻青蛙從任意的地點出發,跳k步之後到達起點,問有多少這樣的k滿足題目要求。
易知當 gcd(n,k) 滿足條件時,此時的答案是可行的,所以只需要列舉n的因子即可。最外層列舉因子,內層列舉起點,最內層列舉需要走的步數,當最後走完時並未走到岩石,說明此時的因子是一種可行方案,記錄。時間複雜度為n的因子數*因子*n的因子數,大約在O(nlog^2)左右。
程式碼實現:
/* Look at the star Look at the shine for U */ #include<bits/stdc++.h> #define ll long long #define PII pair<int,int> #define sl(x) scanf("%lld",&x) using namespace std; const int N = 1e6+5; const int mod = 1e9+7; const int INF = 0x3f3f3f3f; const double PI = acos(-1); ll inv(ll b){if(b==1)return 1; return (mod-mod/b)*inv(mod%b)%mod;} ll fpow(ll n,ll k){ll r=1;for(;k;k>>=1){if(k&1)r=r*n%mod;n=n*n%mod;}return r;} char s[N]; int vis[N]; int main() { int n,i,j,k; scanf("%s",s); n = strlen(s); for(i = 1;i < n;i++) { if(n%i) continue; for(j = 0;j < i;j++) { int flag = 1; for(k = 0;k <= n/i;k++) { if(s[(j+k*i)%n] == 'P') { flag = 0; break; } } if(flag) { vis[i] = 1; break; } } } ll ans = 0; for(i = 1;i < n;i++) if(vis[__gcd(n,i)]) ans++; printf("%lld\n",ans); }