Pagini recente » Cod sursa (job #1746719) | Cod sursa (job #3212534) | Cod sursa (job #1906281) | Cod sursa (job #2234960) | Cod sursa (job #80359)
Cod sursa(job #80359)
#include <cstdio>
#include <iostream>
const int maxp = 31630;
const int nrp = 3406;
FILE *in = fopen("zero2.in","r"), *out = fopen("zero2.out","w");
int k;
int pr[nrp];
int exp[maxp];
int z;
int facts[nrp];
int N, B;
void erast()
{
char x[maxp];
for ( int i = 2; i < maxp; i += 2 )
x[i] = 'x';
pr[k++] = 2;
for ( int i = 3; i < maxp; i += 2 )
if ( x[i] != 'x' )
{
pr[k++] = i;
for ( int j = i*i; j < maxp; j += i )
x[j] = 'x';
}
}
void fact()
{
for ( int i = 0; pr[i]*pr[i] <= B; ++i )
while ( B % pr[i] == 0 )
B /= pr[i], ++exp[ pr[i] ], facts[z++] = pr[i];
if ( B > 1 )
++exp[ B ], facts[z++] = B;
}
long long S(int pr)
{
long long k = (N / pr) - 1;
//printf("%lld\n", k * (k+1)/2*pr + (k+1)*(N-(k+1)*pr+1));
return k * (k+1)/2*pr + (k+1)*(N-(k+1)*pr+1);
}
long long nr(int pr)
{
long long sol = 0;
int p = pr;
long long t;
while ( (t = S(pr)) )
sol += t, pr *= p;
return sol;
}
int main()
{
erast();
int w, h;
for ( int j = 0; j < 10; ++j )
{
fscanf(in, "%d %d", &w, &h);
N = w, B = h;
fact();
long long answ = nr( facts[0] ) / exp[ facts[0] ];
for ( int i = 1; i < z; ++i )
{
long long t = nr( facts[i] ) / exp[ facts[i] ];
if ( t < answ )
answ = t;
}
fprintf(out, "%lld\n", answ);
z = 0;
memset(exp, 0, sizeof(exp));
}
return 0;
}