Cod sursa(job #465752)

Utilizator miculprogramatorA Cosmina - vechi miculprogramator Data 25 iunie 2010 12:52:56
Problema Ratphu Scor 20
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 1 Marime 2.26 kb
#include <stdio.h>
#include <string.h>
using namespace std;

#define MAX 100000

char sir[40];
int ciur[MAX], p[100], st[40];
int i, j, k, P, n;
int lg, AS, suma;
long long solutie;
int numar;

void init ()
{
	st[k] = 0;
}

int Am_Succesor ()
{
	if (st[k] < n)
	{
		st[k] ++;
		return 1;
	}
	return 0;
}

int E_Valid ()
{
	for (j=1; j<k; ++j)
		if (st[k] == st[j])
			return 0;
	return 1;
}

int Solutie ()
{
	if (k == n)
		return 1;
	return 0;
}

void back ()
{
	k = 1;
	init ();
	while (k > 0)
	{
		do
		{ }
		while ( (AS=Am_Succesor()) && !E_Valid() );
		if (AS)
			if (Solutie () )
			{
                numar = 0;
                //numar = numar * 10 + (sir[st[k-2]-1] - '0');
                numar = numar * 10 + (sir[st[k-1]-1] - '0');
                numar = numar * 10 + (sir[st[k]-1] - '0');
                //printf ("\nnumar = %d\n______\n", numar);
                int gasit = 1;
                for (i=1; i<=lg; ++i)
                {
                    if (p[i] == 3)
                        if (suma % 3 != 0)
                        {
                            gasit = 0;
                            break;
                        }
                    if (numar % p[i] != 0)
                    {
                        gasit = 0;
                        break;
                    }
                }
                if (gasit)
                    solutie ++;

			}
			else
			{
				k ++;
				init ();
			}
		else
			k --;
	}
}



int main ()
{
    FILE *f = fopen ("ratphu.in","r");
    FILE *g = fopen ("ratphu.out","w");
    fscanf (f,"%s", sir);
    fscanf (f,"%d", &P);

    n = strlen(sir);
    for (i=0; i<n; ++i)
        suma += (sir[i] - '0');

    for (i=2; i<MAX; ++i)
        ciur[i] = 1;
    for (i=2; i*i<MAX; ++i)
        if (ciur[i] == 1)
            for (j=2; j*i<MAX; ++j)
                ciur[j*i] = 0;

    j = 2;
    while (P > 1)
    {
        while (ciur[j] != 1)
            j ++;
        if (P % j == 0)
        {
            lg ++;
            p[lg] = j;
            while (P % j == 0)
                P /= j;
        }
        j ++;
    }

    back();

    fprintf (g,"%lld", solutie);

    fclose(g);
    fclose(f);
    return 0;
}