All pastes #77991 Raw Edit

watnum2

public text v1 · immutable
·published 2006-07-03 17:37 UTC
rendered paste body
#include<stdio.h>
#include<math.h>
#define     MAX    2000002
unsigned long int ziValues[MAX];
unsigned long int getGcd(unsigned long int greater, unsigned long int lesser)
{
    unsigned long int modval = (greater%lesser);
    if(modval==0)
    return lesser;
    return getGcd(lesser,greater%lesser);
}
unsigned long int gcd(unsigned long int a, unsigned long int b)
{
         if(a>b)
         return getGcd(a,b);
         else
         return getGcd(b,a);
}
long int getNoQns(unsigned long int num)
{
    long int pos = 0;
    while(num>1)
    {
        num=((num+1)/2u);
        pos++;
    }
    return pos;
}
unsigned long int getZiVal(unsigned long int num)
{
    unsigned long int n, fcnt, primeflag = 1, limit, factor;
    double tmp;
    tmp = (double)num;
    limit = (int)sqrt(tmp)+1;
/*    printf("%lu - %lu",num, limit);*/
    for(n=2u;n<=limit && n<num;n++)
    {
        if(num%n==0)
        {
            if(primeflag==1)
            {
                factor=n;
                primeflag = 0;
            }
            if(gcd(n, num/n)==1)
            {
                ziValues[num]=ziValues[n]*ziValues[num/n];
                return ziValues[num];
            }
        }
    }
    if(primeflag == 1)
    {
        ziValues[num] = (num-1);
        return ziValues[num];
    }
/*    printf("%");
    fcnt=0l;
    for(n=1;n<num;n++)
    {
        if(gcd(num, n)==1)
        {
            fcnt++;
        }
    }
    ziValues[num]=fcnt;*/
    ziValues[num]=(num-num/factor);
    return ziValues[num];
}
int main()
{
    unsigned long int iter, cnt, n;
    scanf("%lu",&n);
    cnt=0u;
    for(iter=2u;iter<=n;iter++)
    {
          cnt+=getZiVal(iter);
/*          printf("+%lu\n",cnt);*/
    }
    printf("%ld\n",getNoQns(cnt));
    return 0;
}