在C ++中打印(因子2 ^ n)/(2 ^ n -1)mod m

时间:2014-03-16 13:21:13

标签: c++ factorial

我们如何在C ++中存储和打印factorial(2 ^ n)/(2 ^ n -1))mod1000000009。这里n可以大到20.当我尝试使用以下代码打印它时,它显示n = 20的分段错误     #包括     #包括     使用namespace std;

long int factorial(int n)
{
if(n<=1){return 1;}
else
return (n%1000000009)*(factorial(n-1))%1000000009;

}

int main()
{

int K;
long long int numofmatches=0;
long long int denominator=0;
long long int factor=0;
long long int times=0;
long long int players=0;
cin>>K;


if(K==1)
{
    cout<<2<<endl<<2<<endl; 
    return 0;
}    
else
{
    denominator=pow(2,K);
cout<<"Denominator="<<denominator<<endl;

numofmatches=factorial(denominator)%1000000009;

denominator-=1;
cout<<"numberofmatches="<<numofmatches<<endl;
cout<<"Denominator="<<denominator<<endl;

factor=numofmatches/denominator;
cout<<"Factor="<<factor<<endl;

while(times<=denominator)
{
cout<<(times*factor)<<endl;
++times;
}

}
return 0;
}

1 个答案:

答案 0 :(得分:2)

首先,请注意(2^n)! / (2^n-1)等于(2^n-2)! x 2^n

现在,(2^20-2)!本身已经是一个非常大的数字来计算。

你可以做的是,在每次乘法后用1000000009模拟中间结果:

#define MAX ((1<<20)-2)

unsigned long long res = 1;
for (unsigned int i=1; i<=MAX; i++)
    res = (res*i)%1000000009;
res = (res*(MAX+2))%1000000009;

如果要在1到20之间迭代n的所有值,则可以使用:

#define MAX_N 20

unsigned int arr[MAX_N+1] = {0};

void Func()
{
    unsigned int i = 1;
    unsigned long long res = 1;
    for (int n=1; n<=MAX_N; n++)
    {
        unsigned int max = (1<<n)-2;
        for (; i<=max; i++)
            res = (res*i)%1000000009;
        arr[n] = (unsigned int)((res*(max+2))%1000000009);
    }
}

BTW,对于大于29的任何n,结果将只为0,因为(2^30-2)大于1000000009。

因此(2^30-2)!可被1000000009整除,因此(2^30-2)! mod 1000000009等于0.