給定函數使得f(N)= 1^1 * 2^2 * 3^3 ..... N^N。我必須計算f(N)/ f(r)* f(N-r)。 我的C代碼在下面給出,但它適用於小的N如5或6如何以有效的方式計算功率
#include<stdio.h>
unsigned long long power(long x, long y)
{
unsigned long long temp;
if(y == 0)
return 1;
temp = power(x, y/2);
if (y%2 == 0)
return temp*temp;
else
return x*temp*temp;
}
int main(){
unsigned long long N,M,Q,r[100001],j;
int t,i;
scanf("%d",&t);
while(t--){
scanf("%llu%llu%llu",&N,&M,&Q);
for(i=0;i<Q;i++)
scanf("%llu",&r[i]);
for(i=0;i<Q;i++){
unsigned long long mult=1;
for(j=2;j<=N;j++){
mult=mult*(power(j,j));
}
unsigned long long mult1=mult;
mult=1;
//unsigned long long ans=mult/((power(r[i],r[i]))*(power((N-r[i]),(N-r[i]))));
for(j=2;j<=r[i];j++)
mult=mult*(power(j,j));
unsigned long long mult2=mult;
mult=1;
for(j=2;j<=N-r[i];j++)
mult=mult*(power(j,j));
unsigned long long mult3=mult;
mult=1;
unsigned long long ans=mult1/(mult2*mult3);
printf("%llu\n",ans%M);
}
}
return 0;
}
假設中,f(5)= 1^1 * 2^2 * 3^3 * 4^4 * 5^5 = 86400000.如果N非常大N < = 10^5.那麼我怎麼能存儲這麼大的值。任何一個給我一個有效的算法來找到這個值,並將它存儲在任何數組中。感謝您提前。
如果你用很長很長的類型,你有-9,223,372,036,854,775,808範圍9,223,372,036,854,775,807。如果你使用花車,你會從3.4E +/- 38(7位數字)中獲得。 http://msdn.microsoft。com/en-us/library/s3f49ktz.aspx – JBaczuk
作爲一個例子,考慮N = 100000和r = 1。然後你有'f(100000)/(f(1)* f(99999))',它是'100000^100000'。換句話說,答案有500,000個數字。從中可以看出,您需要查找或編寫BigInteger庫。 – user3386109
你不能在等式上做一點代數嗎? –