-1

私はオンライン審査システムから1つの問題を解決しようとしています。私にはうまくいく解決策がありますが、十分に効率的ではありません。ここに問題があります:

k個の方法のように製品n=a∙bで想像できる最小の数nはどれですか?製品a∙bおよびb∙aは、すべての数値が自然である(1≤k≤50)方法の1つです。

1つの数値kを入力します。1つの数値nを出力します。

私のコードは4つのテストに合格しませんでした。k = 31、37、47には遅すぎます。私はこの問題について2日間考えていましたが、改善は見られませんでした。これが私のコードです。何かアイデアがあれば共有してください。

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>

    int prime[10000];
    long x,j,i,flag,k,length,p,checker,count,number;

    int main()
    {

    prime[0]=2;
    scanf("%ld",&k);
    //I find prime numbers between 1 and 1000. 1000 can be changed, just for testing

    for (i=3;i<=1000;i=i+2)
            {
            flag=0;
            for (j=2;j<=sqrt(i);j++)
                    {
                    if(i%j==0)
                            {
                            flag=1;
                            break;
                            }
                    }
            if(flag==0)
                    {
                    x++;
                    prime[x]=i;
                    }
            }

    length=x;
    //this loop is too big I know, again for testing. I suspect, there must be a way to make some changes to this for loop 

    for (i=1;i<10000000000;i++)
            {
            number=i;
            p=1;
            for(x=0;x<=length;x++)
                    {
                    if(prime[x]>sqrt(i))
                    break;
                    count=0;
                    while(number%prime[x]==0)
                            {
                            number=number/prime[x];
                            count++;       
                            }
                    p=p*(count+1); 
//I find prime factors of numbers and their powers, then calculate number of divisors

                    }
            //printf("%d\n",p);
            //number of ways is just number of divisors/2 or floor (divisors/2)+1
            if(p%2==0)
            checker=p/2;
            else
            checker=floor(p/2)+1;
            if(checker==k)
                    {
                    printf("%ld\n",i);
                    break;
                    }
            }

    return 0;
    }
4

1 に答える 1

1

私が問題を正しく理解している場合、それは正確に2kの約数を持つ最小の数nであるかどうかを尋ねています(1とnを考慮する必要がありますか?)

実際、数値に除数aがある場合、n / a = bは整数であり、n = a * bです(aとbを1回だけカウントするため、除数の数を2で割る必要があります)

編集

それを行うには確かに時間がかかります。これがアイデアです。

n = p1 ^(a1)* p2 ^(a2)... pn ^(an)(これは数の素因数分解です)の形式の数nの場合、除数の数は(a1 + 1)(a2 +1)...(an + 1)

したがって、kの約数を持つ数を見つけたい場合は、kを因数分解します。次に、最大の因子を最小の素数に割り当てます。たとえば、k = 2 * 5 * 7の場合、nは2 ^ 7 * 3 ^ 5 * 5^2である必要があります

(a、b)が(b、a)に等しいことを考慮しなかったので、それはわかりませんが、少し遊んでみればうまくいくはずです

k = 37を取ります。次に、数を2倍にします-(対称性を考慮するため)。これで、74が得られます。nをn = n * 1と想像できる場合は、74を因数分解する必要があります(つまり、2 * 37)。次に、36を2に、1を3にすると、n = 2 ^(36)* 3=206158430208になります。

できない場合は、以前に取得した数値に1を加算する必要があります(この場合、74 + 1 = 75 = 25 * 3)。このようにして、n = 2 ^ 24 * 3 ^ 2=150994944を取得します

上記のいずれでもない場合、私はおそらく間違っています...

于 2012-12-04T22:10:07.703 に答える