Cod sursa(job #1309250)

Utilizator MaarcellKurt Godel Maarcell Data 5 ianuarie 2015 16:39:35
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#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;
}