
KPI12_G
By:
prestige on
Aug 21st, 2012 | syntax:
C++ | size: 1.37 KB | hits: 52 | expires: Never
#include <iostream>
#include <cmath>
#include <vector>
#include <string>
using namespace std;
const int mod = (1e+9)+7;
int n;
string s;
long long sum = 0;
vector<int> z_function (string s) {
int n = (int) s.length();
vector<int> z (n);
for (int i=1, l=0, r=0; i<n; ++i) {
if (i <= r)
z[i] = min (r-i+1, z[i-l]);
while (i+z[i] < n && s[z[i]] == s[i+z[i]])
++z[i];
if (i+z[i]-1 > r)
l = i, r = i+z[i]-1;
}
return z;
}
//long long binpow (long long a, long long n) {
// long long res = 1;
// while (n) {
// if (n & 1)
// res = ((res % mod) * (a % mod)) % mod;
// a = ((a % mod) * (a % mod)) % mod;
// n >>= 1;
// }
// return res;
//}
long long binpow (long long a, long long n) {
if (n == 0)
return 1ll;
if (n % 2 == 1)
return (binpow (a, n-1) * (a % mod)) % mod;
else {
long long b = binpow (a, n/2);
return (b * b) % mod;
}
}
int main() {
cin >> s;
int len = s.length();
for (int i = 1; i < len; i++) {
int t = 0;
if(len % i ==0) {
string b;
for (int j = 0; j < i; j++) {
b += s[j];
}
b += "#" + s;
vector<int> a = z_function(b);
for (int j = 0; j < len / i; j++) {
if(a[i + j * i + 1] == i) {
t++;
}
}
}
if(t == (len / i))
sum = (sum + binpow(26, i) - 1ll) % mod;
else
sum = (sum + binpow(26, i)) % mod;
}
cout << sum % mod;
return 0;
}