Pagini recente » Cod sursa (job #1780843) | Cod sursa (job #1183714) | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #1309250)
#include <iostream>
#include <fstream>
#include <cstring>
#define base 39
#define prim1 104723
#define prim2 104729
#define LL long long int
using namespace std;
int N,p[1000],ct[1000],d[1000],K,L,t,nr; int h1[10000010],h2[10000010]; char c[10000010];
void bck(int k){
if (k>K){
d[++t]=nr;
return;
}
bck(k+1);
for (int i=1; i<=ct[k]; i++){
nr*=p[k];
bck(k+1);
}
for (int i=1; i<=ct[k]; i++)
nr/=p[k];
}
int f_pow(int nr,int p,int prim){
int res=1;
nr%=prim;
for (int i=1; i<=p; i<<=1){
if (i&p)
res=(res*nr)%prim;
nr=(nr*nr)%prim;
}
return res;
}
int main(){
ifstream fin("perioada2.in");
ofstream fout("perioada2.out");
fin >> N;
fin >> (c+1);
c[0]='-';
int i,j=N;
for (i=2; i*i<=N; i++)
if (N%i==0){
p[++K]=i;
while (N%i==0){
ct[K]++;
N/=i;
}
}
if (N!=1) p[++K]=N,ct[K]=1;
N=j;
nr=1; bck(1); t--;
for (i=1; i<=N; i++){
h1[i]=(1LL*h1[i-1]*base+c[i])%prim1;
h2[i]=(1LL*h2[i-1]*base+c[i])%prim2;
}
int cnt=0,hash1,aux1,hash2,aux2;
for (i=1; i<=t; i++){
hash1=h1[d[i]],hash2=h2[d[i]];;
for (j=2*d[i]; j<=N; j+=d[i]){
aux1=(h1[j]-(1LL*h1[j-d[i]]*f_pow(base,d[i],prim1))%prim1+prim1)%prim1;
aux2=(h2[j]-(1LL*h2[j-d[i]]*f_pow(base,d[i],prim2))%prim2+prim2)%prim2;
if (aux1!=hash1 || aux2!=hash2)
break;
}
if (j>N) cnt++;
}
fout << cnt;
return 0;
}